Как разделить нагрузку между разными процессорами - PullRequest
2 голосов
/ 11 апреля 2011

Я выполняю некоторый параллельный код на машине с 4 процессорами Intel и 8 ядрами на каждом. Я использую TBB. Предположим, что данный цикл (который я распараллеливаю) имеет X итераций. Как выбрать размер зерна, чтобы обеспечить загрузку равномерно разделен?

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Предположим, у вас N одинаково мощных процессоров.

Если нет зависимостей, переносимых в цикле (например, ничто в итерации i не используется последующими итерациями), тогда вы можете просто запустить итерации цикла 0..X / N на ЦП 1 и итерации (X / N) +1 .. (2 * X / N) на ЦП 2 и т. Д., Предполагая, что каждая итерация занимает ровно одинаковое количество времени или, по крайней мере, среднее значение, которое не изменяется в широких пределах.

Если есть , переносятся ли петли зависимости, у вас могут возникнуть проблемы, если итерация i зависит от всех предыдущих итераций. Если это зависит только от предыдущих k итераций, вы можете сделать так, чтобы CPU1 делал итерации 0..X / N, а CPU2 делал итерации X / Nk .. (2 * X / N), тратя впустую некоторую работу, но позволяя CPU2 собирать необходимые результаты и т. д. для всех процессоров.

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

0 голосов
/ 11 апреля 2011

С TBB вам не нужно выбирать размер зерна для parallel_for.В большинстве случаев TBB будет динамически распределять нагрузку по умолчанию довольно хорошо.Ответ Ира Бакстера правильно описывает, как вы должны распределить работу по пулу потоков;но у TBB уже есть подобные механизмы, которые делают это для вас.

ДОБАВЛЕННО: Конечно, ручное разбиение работы может дать лучшие результаты в сложных случаях.Хотя в этом случае, вероятно, потребуется использовать задачи TBB, так как parallel_for может не обеспечивать достаточного контроля;например, в общем случае невозможно указать точный размер блока на поток.

...