collapse в OpenMP
От: eiler13  
Дата: 04.11.13 05:06
Оценка:
Объясните, пожалуйста, что делает опция collapse в директиве for (OpenMP)? Если можно с примером.
Re: collapse в OpenMP
От: Razzak  
Дата: 05.11.13 11:43
Оценка: 2 (1)
Здравствуйте, eiler13, Вы писали:

E>Объясните, пожалуйста, что делает опция collapse в директиве for (OpenMP)? Если можно с примером.


Это ж ОпенМП 3.0 и выше — его еще далеко не все компиляторы поодерживают. Оно тебе точно надо?

http://www.openmp.org/mp-documents/OpenMP3.1.pdf достаточно подробно это расписывает (хоть и бестолково, на мой вкус).

Смысл опции в том, что она "сворачивает" вложенные циклы. Т.е. при collapse(2) вместо for(i=0;...){ for(j=0;...) {... }} будет один большой цикл for, в котором будут сразу две переменные i и j. В практическом плане это дает более равномерное распараллеливание, если тредов много, а итераций в самом внешнем цикле — мало (например, если у тебя во внешнем цикле всего 10 итераций, а процессорных ядер в системе доступно 32, то без этой хитрой опции цикл распараллелится всего на 10 ядер).

В данном примерчике (скопипащен из вышеприведенного талмуда) два первых вложенных цикла (k и j) будут свернуты в один большой и параллельный, а самый внутренний цикл останется:
void bar(float *a, int i, int j, int k);
int kl, ku, ks, jl, ju, js, il, iu,is;
void sub(float *a)
{
   int i, j, k;
#pragma omp for collapse(2) private(i, k, j)
   for (k=kl; k<=ku; k+=ks)
      for (j=jl; j<=ju; j+=js)
         for (i=il; i<=iu; i+=is)
            bar(a,i,j,k);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.