Последовательность цикла в OpenMP Свернуть совет по производительности
Я нашел предложение производительности Intel на Xeon Phi на Collapse
пункт в OpenMP.
#pragma omp parallel for collapse(2) for (i = 0; i < imax; i++) { for (j = 0; j < jmax; j++) a[ j + jmax*i] = 1.; }
Модифицированный пример для лучшей производительности:
#pragma omp parallel for collapse(2) for (i = 0; i < imax; i++) { for (j = 0; j < jmax; j++) a[ k++] = 1.; }
Я тестирую оба случая на Фортране с похожим кодом на обычном процессоре, используя GFortran 4.8, они оба получают правильный результат. Тестирование с использованием аналогичного кода Fortran с более поздним кодом не проходит для GFortran5.2.0 и Intel 14.0
Но, насколько я понимаю, тело цикла для OpenMP должно избегать переменной, зависящей от последовательности цикла, для этого случая k
Так почему же в последнем случае он может получить правильный результат и еще лучшую производительность?
1 ответ
Вот эквивалентный код для двух подходов при использовании collapse
пункт. Вы могли видеть, что второй лучше.
for(int k=0; k<imax*jmax; k++) {
int i = k / jmax;
int j = k % jmax;
a[j + jmax*i]=1.;
}
for(int k=0; k<imax*jmax; k++) {
a[k]=1.;
}