Как запустить параллельную библиотеку задач C# на нескольких машинах (например, на рендер-ферме)?


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

Однако существует ограничение на количество потоков, доступных на одном процессоре (я думаю, что даже лучшие Xeons, которые можно купить за деньги, в настоящее время имеют около 16).

Я читал о том, как рендер-фермы с "сеткой" из нескольких недорогих процессоров в их собственных машинах-это хороший способ увеличить общее количество ядер, но я понятия не имею, как я собираюсь реализовать один из них. Реализована ли она на уровне ОС с помощью серверной технологии Microsoft (и если да, то как?), или мне также нужно изменить сам код C#?

Любая помощь или ссылки на существующую информацию будут весьма признательны.

2   5  

2 ответа:

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

Hadoop

У Microsoft были планы коммерциализировать Dryad как LINQ в HPC , но этот проект был отодвинут на второй план некоторое время назад (я работал над этим проектом до того, как ушел из Microsoft). Я верю, что вы все еще можете получить окончательный "публичный предварительный просмотр", но он не поддерживается. Команда SQL решила работать с сотрудниками Hadoop/Hortonworks при получении дружественного дистрибутива Hadoop для Windows / Azure / .NET с земли. Насколько мне известно, единственное, что они доставили, - Это HDInsight . Служба Hadoop, работающая в Azure.

Теперь существует Microsoft .NET SDK для Hadoop, который позволит вам управлять кластером и отправлять задания и т. д. Он не позволяет писать код, который выполняется на узлах Hadoop. Однако вы можете использовать Hadoop streaming API. Это довольно низкий уровень, но язык агностик, так что вы может в значительной степени использовать его для интеграции кода map reduce, написанного на любом языке с помощью Hadoop. Более подробную информацию об этом можно найти в этом блоге.

Hadoop для разработчиков .NET

Если вы хотите сделать это в меньшем масштабе (10s узлов), то я бы искал что-то вроде MPI .NET. похоже, что этот проект был заброшен, но что-то подобное, вероятно, то, что вы хотите.

Вы можете заглянуть в некоторые, как Дриада - http://research.microsoft.com/en-us/projects/dryadlinq/default.aspx

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

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

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

    Пусть мастер вычисления сократит задачу до числа доступных клиентских компьютеров.
  1. запишите параметры для запуска расчета для каждого клиента в файл, общий для всех в сети.
  2. пусть клиенты ищут файлы, посвященные им, и пинают расчет для их части, когда файл появляется. Выход записывается обратно в результирующий файл.
  3. сервер будет сидеть и слушать всех клиентов, выполняющих свои задания.

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