2008-11-08 1 views
6

У меня много неиспользуемых компьютеров дома. Каким будет самый простой способ использовать их для параллелизации моей программы на C# с небольшими изменениями кода или без них?Что является самым простым способом распараллеливать мою программу C# на нескольких компьютерах

Задача, которую я пытаюсь сделать, включает в себя цикл через множество английских предложений, набор данных можно легко разбить на более мелкие куски, обрабатываемые одновременно на разных машинах.

+0

Можете ли вы раскрыть, что вы пытаетесь выполнить? Рассматривали ли вы базу данных и/или полную индексацию текста для своих нужд? – vmarquez 2008-11-08 19:37:45

+0

Требуются детали. По вашему вопросу в одиночку - мы должны предположить, что распараллеливание было для повышения скорости одного прогона? Также можно считать, что вы просто хотите выполнить одну и ту же операцию на нескольких машинах, у которых есть совершенно другой ответ. – Klathzazt 2008-11-08 20:06:00

ответ

2

Возможно, это невозможно.

Как распараллеливать программу полностью зависит от того, что делает ваша программа и как она написана, и обычно требует обширных изменений кода и увеличивает сложность вашей программы в несколько раз.

Обычный способ легко повысить степень совместимости в программе - это выполнить задачу, повторяющуюся много раз, и просто написать функцию, которая разбивает эту задачу на куски и отправляет их в разные ядра для обработки.

7

... с небольшими изменениями или без изменений кода?

Сложно. В основном, посмотрите на WCF как способ связи между различными экземплярами программы по сети. В зависимости от алгоритма, структура, возможно, придется резко изменить или вообще не изменить. В любом случае вам нужно найти способ разделить проблему на части, которые действуют независимо друг от друга. Затем вы должны разработать способ распределения этих частей между разными экземплярами и сбора результирующих данных.

PLinq предлагает отличный способ распараллеливать вашу программу без больших изменений, но это работает только на одном процессе, в разных потоках, и только тогда, когда алгоритм поддается параллелизации. В общем, необходим ручной рефакторинг -.

1

Вам необходимо запустить приложение в распределенной системе, google для распределенных окон вычислений или для grid-вычислений C#.

2

Ответ зависит от характера работы, которую будет выполнять ваша заявка. Различные виды работ имеют разные возможные решения для распараллеливания. Для некоторых типов нет возможности/возможного способа распараллеливания.

Самый простой сценарий, который я могу придумать, - это приложение, работа которого легко может быть разбита на дискретные куски работы. Если это так, то вы просто создаете приложение для работы на одном рабочем месте. Предоставьте вашему приложению возможность принимать новые задания и доставлять готовые задания. Затем создайте планировщик заданий поверх него. Этот планировщик может быть частью одного и того же приложения (настроить один компьютер как планировщик, а остальные - как клиенты) или отдельное приложение.

Есть и другие вопросы, которые следует учитывать: как произойдет связь между машинами (файлами?, Сетевыми соединениями?); приложение должно быть в состоянии сообщить/be_queried о проценте выполненной работы ?; необходимо уметь заставить приложение прекратить выполнение текущей работы ?; и т.д.).

Если вам нужен более подробный ответ, отредактируйте свой вопрос и включите сведения об аппликации, проблему, которую решает приложение, ожидаемое количество заданий и т. Д. Затем сообщество придет с более конкретными ответами.

1

Является ли каждое предложение обработано независимо или оно каким-то образом сочетается? Если ваша обработка работает по одному предложению за раз, вам совсем не нужно менять свой код.Просто выполните один и тот же код на каждой из ваших машин и разделите данные (ваш список предложений) между ними. Вы можете сделать это либо путем установки части данных на каждой машине, либо путем совместного использования базы данных и назначения отдельного блока каждой машине.

Если вы хотите, чтобы немного изменить свой код, чтобы облегчить параллелизм, поделитесь всей базой данных и получите код «отметьте» каждое предложение, когда оно обработано, а затем найдите следующее немаркированное предложение для обработки. Это даст вам нежное введение в концепцию thread safety - методы, которые гарантируют, что один процессор не будет мешать другому.

Как всегда, чем больше деталей вы можете предоставить о своем конкретном приложении, тем лучше сообщество SO может адаптировать наши ответы к вашей цели.

Удачи - это звучит как интересный проект!

0

Прежде чем я буду вкладывать средства в распараллеливание вашей программы, почему бы просто не попытаться сломать наборы данных на кусочки и вручную запустить вашу программу на каждом компьютере и собрать результаты вручную. Если это работает, попробуйте автоматизировать его со сценариями и написать программу для сопоставления выходов.

2

Dryad (вариант Microsoft MapReduce) решает именно эту проблему (распараллеливайте программы .net на нескольких компьютерах). Сейчас он находится на стадии исследования. Жаль нет нет ПДТА еще :-(

0

Есть несколько программных решений, которые позволяют использовать оборудование на основе товарного. Одним из них является Appistry. Я работаю в Appistry, и мы сделали множество решений для запуска приложений C# через сотню машины

несколько полезных ссылок:. http://www.appistry.com/resource-library/index.html

Вы можете скачать продукт бесплатно здесь: http://www.appistry.com/developers/

Надежда это помогает -Brett

0

Возможно, вы захотите взглянуть на Flow-Based Programming - он имеет реализацию Java и C#. Большинство подходов к этой проблеме связаны с попыткой использовать обычную однопоточную программу и выяснить, какие части могут работать параллельно. FBP использует другой подход: приложение разработано с самого начала в терминах нескольких компонентов «черного ящика», работающих асинхронно (подумайте о сборочной линии производства). Поскольку обычная однопоточная программа действует как один компонент в среде FBP, очень просто расширить существующее приложение. Фактически, фрагменты существующего приложения часто могут быть разбиты и превращены в отдельные компоненты, при условии, что они могут выполняться асинхронно с остальной частью приложения (т. Е. Не подпрограммами). Кто-то назвал это «превращением айсберга в кубики льда»).

Смежные вопросы