Балансировка нагрузки в приложении параллельной обработки

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

Приложение должно выполнять некоторые очень затратные в вычислительном отношении операции с очень большим набором данных за тысячи итераций:

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])

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

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

Некоторые особенности:

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

  2. Некоторые из низкоуровневых машин (настольные компьютеры, которые простаивают, но должны просыпаться, когда кто-то логин) могут присоединиться и покинуть сетку в любое время.

  3. Выделенные серверы также могут присоединяться к сетке и выходить из нее, но это предсказуемо.

На данный момент лучшая идея, которую мне удалось придумать, это:

  1. Пусть каждый узел сам отслеживает время. требуется для обработки группы из n ячеек в матрице (ячеек, обрабатываемых за единицу времени) и сообщения об этом в центральный репозиторий.
  2. Оцените это время по отношению к общему времени для кадра (по всей сетке) ) моделирования и общий размер проблемной области. Таким образом, каждый узел получит оценку, выраженную в рабочих единицах (ячейках матрицы) за раз, и скалярную оценку, выражающую его производительность по сравнению с остальной частью сетки.
  3. В каждом кадре распределите рабочую нагрузку на основе этих оценок так, чтобы каждая машина заканчивает как можно ближе к одному и тому же времени. Если машина A в 100 раз быстрее, чем машина B , она получит в 100 раз больше ячеек матрицы для обработки в данном кадре (при условии, что размер матрицы достаточно велик, чтобы гарантировать включение дополнительных машины).
  4. Узлы, которые покидают сетку (рабочие столы, которые вошли в систему, и т. Д.) Будут перераспределять свою рабочую нагрузку между оставшимися узлами.

Или ,

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

Если это имеет значение, приложение представляет собой комбинацию C # и OpenCL.

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

Изменить

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

Спасибо за отличные подробные ответы.

7
задан 3Dave 28 August 2011 в 13:56
поделиться