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