我在一个类似这样的并行结构中有一个循环
# pragma omp parallel ... //directives
{
// other loops ....
#pragma omp for
for (i=1; i<=nx; i++) for (j=1; j<=ny; j++) for (k=1; k<=nz; k++)
{
p_sparse_s[i][j][k] = RLL[i][j][k] + (riri_sparse2 / noemer_sparse) * p_sparse_s[i][j][k];
}
// other loops ....
}
在检查时,由于假定的依赖关系,似乎未对该循环进行矢量化处理。通过依赖关系分析进行进一步检查时,没有依赖关系(从代码中可以明显看出)。应该如何更改指令,以便告诉编译器强制执行矢量化?
P.S。如果我使用ivdep指令,那么编译器也不会对循环进行矢量化处理。
# pragma omp parallel ... //directives
{
// other loops ....
#pragma ivdep
#pragma omp for
for (i=1; i<=nx; i++) for (j=1; j<=ny; j++) for (k=1; k<=nz; k++)
{
p_sparse_s[i][j][k] = RLL[i][j][k] + (riri_sparse2 / noemer_sparse) * p_sparse_s[i][j][k];
}
// other loops ....
}
答案 0 :(得分:1)
ivdep
编译指示并不强制编译器对循环进行矢量化处理,以实现应改为使用simd
编译指示。
#pragma omp simd
在您的情况下,您可以简单地将其附加为#pragma omp for simd
。请注意,建议您向simd编译指示添加一些提示,例如您想到的特定类型的矢量化(可在此处找到可用的子句:https://software.intel.com/en-us/node/524530)。