Я создаю приложение для сетевой распределенной параллельной обработки, которое использует комбинацию ресурсов ЦП и ГП на многих машинах.
Приложение должно выполнять некоторые очень затратные в вычислительном отношении операции с очень большим набором данных за тысячи итераций:
for step = 0 to requested_iterations
for i = 0 to width
for j = 0 to height
for k = 0 to depth
matrix[i,j,k] = G*f(matrix[i,j,k])
Кроме того, матричные операции должны выполняться синхронно: то есть каждая итерация зависит от результатов кадра, который пришло непосредственно перед ним.
Оборудование, доступное в этой специальной сети, включая как выделенные серверы, так и простаивающие настольные машины, сильно различается по производительности от машины к машине. Мне интересно, как лучше всего сбалансировать рабочую нагрузку по всей системе.
Некоторые особенности:
Сетка должна быть как можно более надежной. Для выполнения некоторых симуляций требуются недели, и было бы неплохо не отменять запуск, если одна из 100 машин отключается.
Некоторые из низкоуровневых машин (настольные компьютеры, которые простаивают, но должны просыпаться, когда кто-то логин) могут присоединиться и покинуть сетку в любое время.
Выделенные серверы также могут присоединяться к сетке и выходить из нее, но это предсказуемо.
На данный момент лучшая идея, которую мне удалось придумать, это:
A
в 100 раз быстрее, чем машина B
, она получит в 100 раз больше ячеек матрицы для обработки в данном кадре (при условии, что размер матрицы достаточно велик, чтобы гарантировать включение дополнительных машины). Или ,
Организуйте узлы в древовидной структуре, где каждый узел имеет присвоенный "вес".Узлы, расположенные выше в дереве, имеют вес, основанный на их способностях в сочетании со способностями их потомков. Этот вес регулируется для каждого кадра. Когда узел теряет связь со своим дочерним узлом, он использует кэшированный древовидный граф, чтобы связаться с осиротевшими дочерними узлами и повторно сбалансировать свою ветвь.
Если это имеет значение, приложение представляет собой комбинацию C # и OpenCL.
Ссылки на статьи, примеры приложений и особенно учебные пособия приветствуются.
Изменить
Это не домашнее задание. Я превращаю симулятор, который написал в рамках своей диссертации, в более полезный продукт. Сейчас работа распределяется равномерно, без учета производительности каждой машины и без средств восстановления после подключения машин к сети или выхода из нее.
Спасибо за отличные подробные ответы.