我试图理解 OpenMP 打破循环矢量化的概念原因。此外,任何解决此问题的建议都会有所帮助。我正在考虑手动并行化它来解决这个问题,但这肯定不会优雅并导致大量代码膨胀,因为我的代码由几个这样的部分组成,这些部分适合矢量化和并行化。
我在用
Microsoft (R) C/C++ 优化编译器版本 17.00.60315.1 for x64
使用 OpenMP:
信息 C5002:由于原因“502”,循环未矢量化
没有 OpenMP:
信息 C5001:循环矢量化
VS矢量化页面显示此错误发生在以下情况:
归纳变量以某种方式步进,而不是简单的 +1
我可以强制它步入 1 步吗?
循环
#pragma omp parallel for
for (int j = 0; j < H*W; j++)//A,B,C,D,IN are __restricted
{
float Gs = D[j]-B[j];
float Gc = A[j]-C[j];
in[j]=atan2f(Gs,Gc);
}
最大努力(?)
#pragma omp parallel
{// This seems to vectorize, but it still requires quite a lot of boiler code
int middle = H*W/2;
#pragma omp sections nowait
{
#pragma omp section
for (int j = 0; j < middle; j++)
{
float Gs = D[j]-B[j];
float Gc = A[j]-C[j];
in[j]=atan2f(Gs,Gc);
}
#pragma omp section
for (int j = middle; j < H*W; j++)
{
float Gs = D[j]-B[j];
float Gc = A[j]-C[j];
in[j]=atan2f(Gs,Gc);
}
}
}