Прямой вопрос: У меня есть простой цикл с, что может быть, вычислительно интенсивной функцией. Давайте предположим, что каждая итерация занимает одинаковое количество времени (поэтому балансировка нагрузки должна быть легкой).
#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 и нашел этот сайт , который, если вы перейдете к нижней части, имеет пример с тем, что должно быть автоматически сгенерированный вывод. Все итерации с использованием динамического и управляемого планирования назначаются нулевому потоку ??!?
Любое руководство будет с благодарностью !!