我想了解爲什麼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