我想了解为什么OpenMP打破循环矢量化的概念原因。此外,任何修复此问题的建议都会有所帮助。我正在考虑手动并行化这个问题来解决这个问题,但那肯定不会很优雅,并导致大量的代码膨胀,因为我的代码由几个这样的部分组成,这些部分可以用于向量化和并行化。如何提示OpenMP步伐?
我使用
微软(R)C/C++优化编译器版本17.00.60315.1针对x64
对于OpenMP:
信息C5002:循环不矢量化由于原因'502'
没有OpenMP的:
信息C5001:环矢量
的VS vectorization page说,这个错误发生在:
感应变量以某种方式加强不是一个简单的其他+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);
}
}
}
令人惊讶的是,由于atan2f函数,Visual Studio对此进行了矢量化。我还没有尝试用Visual Studio编译它,但是使用GCC它没有矢量化(有或没有OpenMP)。在我的经验中,GCC自动矢量化比Visual Studio更好。你最近问的赏金问题如果你使用了GCC,那么它就没有那么有趣了,因为GCC的帽子没有任何问题向量化短裤的循环。但是,也许这是Visual Studio的自动矢量化更好的一个例子。 – 2013-05-13 17:49:01
我在Visual Studio中试过这个。它像你说的那样矢量化。我真的很惊讶。我没有测试过性能。我想知道Visual Studio为atan2f函数做了什么。它真的有SSE/AVX atan2f功能吗? – 2013-05-14 12:48:09