【发布时间】:2013-05-06 23:52:04
【问题描述】:
我试图了解 OpenMP 打破循环矢量化的概念原因。此外,任何解决此问题的建议都会有所帮助。我正在考虑手动并行化它来解决这个问题,但这肯定不会很优雅并且会导致大量的代码膨胀,因为我的代码包含几个适合矢量化和并行化的部分。
我正在使用
Microsoft (R) C/C++ 优化编译器版本 17.00.60315.1 for x64
使用 OpenMP:
信息 C5002:由于原因“502”,循环未矢量化
没有 OpenMP:
info 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);
}
}
}
【问题讨论】:
-
我很惊讶 Visual Studio 由于 atan2f 函数而将其向量化。我还没有尝试使用 Visual Studio 编译它,但使用 GCC 它不会矢量化(有或没有 OpenMP)。根据我的经验,GCC 的自动矢量化比 Visual Studio 更好。如果您使用 GCC,您最近提出的赏金问题就不会那么有趣了,因为 GCC 使用短裤矢量化循环没有问题。但也许这是 Visual Studio 的自动矢量化更好的一个例子。
-
我在 Visual Studio 中试过这个。它像你说的那样矢量化。我对此感到非常惊讶。我没有测试过性能。我想知道 Visual Studio 为 atan2f 函数做了什么。它真的有 SSE/AVX atan2f 功能吗?
标签: c++ visual-studio-2012 openmp sse vectorization