Последовательность цикла в 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.;
}
Другие вопросы по тегам