openmp: разница в объединении 2 для цикла и без объединения - PullRequest
1 голос
/ 05 декабря 2010

Какая разница в объединении 2 для циклов и парализаций вместе и в параллелировании отдельно

Пример 1. не параллельно параллельно

#pragma omp parallel for
for(i = 0; i < 100; i++) {
//.... some code
}

#pragma omp parallel for
for(i = 0; i < 1000; i++) {
//.... some code
}

2. распараллеливание вместе

#pragma omp parallel
{
#pragma omp for
for(i = 0; i < 100; i++) {
//.... some code
}

#pragma omp for
for(i = 0; i < 1000; i++) {
//.... some code
}
}

какой код лучше и почему ????

1 Ответ

2 голосов
/ 05 декабря 2010

Можно ожидать небольшого выигрыша во втором, потому что каждый является форком / объединением (или функциональным эквивалентом) потоков OMP дважды, а не один раз. Имеет ли это какое-то реальное значение для вашего кода - эмпирический вопрос, на который лучше всего отвечают измерения.

Второй также может иметь более существенное преимущество, если работа в двух циклах независима, и вы можете запустить второй в любое время, и есть причина ожидать некоторого дисбаланса нагрузки в первом цикле. В этом случае вы можете добавить предложение nowait к первым t omp for и, вместо того, чтобы все потоки ожидали окончания цикла for, тот, кто сделал первый, может немедленно перейти к работе над вторым циклом. Или можно поместить два блока кодов каждый в section или task. В общем, вы имеете большой контроль над тем, что делают потоки и как они это делают в параллельном разделе; тогда как когда вы заканчиваете параллельный раздел, вы теряете эту гибкость - все должно объединиться, и все готово.

...