我在OpenMP的Collapse
子句中找到了Intel's performance suggestion on Xeon Phi。
#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在常规CPU上使用类似代码测试Fortran中的两个案例,它们都得到了正确的结果。 使用类似的Fortran代码和更高代码的测试不能通过GFortran5.2.0和Intel 14.0
但据我所知,OpenMP的循环体应该避免&#34;循环序列依赖&#34;变量,对于这种情况是k
,那么为什么在后一种情况下它可以得到正确的结果甚至更好的性能呢?
答案 0 :(得分:2)
这里是使用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.;
}