Здравствуйте, 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);
}