Почему все итерации в цикле распараллеливаются с использованием расписания OpenMP (динамического) для одного потока?(MSVS 2010) - PullRequest
1 голос
/ 14 ноября 2010

Прямой вопрос: У меня есть простой цикл с, что может быть, вычислительно интенсивной функцией. Давайте предположим, что каждая итерация занимает одинаковое количество времени (поэтому балансировка нагрузки должна быть легкой).

#pragma omp parallel
{

#pragma omp for schedule(dynamic)
for ( int i=0; i < 30; i++ )
{
     MyExpensiveFunction();
}

}  // parallel block

Почему все итерации назначены одному потоку? Я могу добавить:

std::cout << "tID = " << omp_get_thread_num() << "\n\n";

и он печатает группу нулей только с последней итерацией, назначенной потоку 1.

Моя система: Я должен поддерживать кросс-компиляцию. Поэтому я использую gcc 4.4.3 и 4.5.0, и они оба работают, как и ожидалось, но для MS 2010 я вижу вышеупомянутое поведение, когда 29 потоков назначаются потоку 0, а одна итерация назначается потоку 1.

Действительно странно: Мне потребовалось немного времени, чтобы понять, что это может быть просто проблемой планирования. Я google'd и нашел этот сайт , который, если вы перейдете к нижней части, имеет пример с тем, что должно быть автоматически сгенерированный вывод. Все итерации с использованием динамического и управляемого планирования назначаются нулевому потоку ??!?

Любое руководство будет с благодарностью !!

Ответы [ 2 ]

2 голосов
/ 14 ноября 2010

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

1 голос
/ 28 ноября 2010
  1. Если каждая итерация занимает одинаковое количество времени, тогда вам фактически не нужно динамическое планирование, которое вызывает больше затрат на планирование, чем статические политики планирования.(static, 1) и (static) должны быть в порядке.

  2. Не могли бы вы сообщить мне длину каждой итерации?Что касается приведенного вами примера (пример MSDN для расписаний), то это потому, что объем работы каждой итерации настолько мал, что первый поток просто получил почти работу.Если вы действительно увеличите работу каждой итерации (по крайней мере, порядка миллисекунды), то вы увидите различия.

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

...