Какой самый простой способ распараллелить мою программу на C # на нескольких ПК? - PullRequest
6 голосов
/ 08 ноября 2008

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

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

Ответы [ 9 ]

7 голосов
/ 08 ноября 2008

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

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

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

2 голосов
/ 08 декабря 2008

Dryad (вариант MapReduce от Microsoft) решает именно эту проблему (распараллеливание программ .net на нескольких ПК). Это сейчас в стадии исследования. Жаль, что CTP пока нет: - (

2 голосов
/ 08 ноября 2008

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

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

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

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

2 голосов
/ 08 ноября 2008

Это, вероятно, невозможно.

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

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

1 голос
/ 08 ноября 2008

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

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

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

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

1 голос
/ 08 ноября 2008

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

0 голосов
/ 22 февраля 2009

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

0 голосов
/ 11 декабря 2008

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

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

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

Надеюсь, это поможет -Brett

0 голосов
/ 08 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...