问题描述
我正在尝试使用 OpenACC 并行化一些代码。
#pragma acc parallel loop reduction (+:matriz())
for(auto i = 0; i <= (width-siz); i += siz)
for(auto j = 0; j <= (width-siz); j += siz)
for(auto k = 0; k <= (width-siz); k += siz)
for(auto l = 0; l <= (width-siz); l += siz)
matriz[i][j][k][l] = matriz[i][j][k+1][l] + matriz[i][j][k][l+1];
矩阵声明如下:
vector<vector<vector<vector<short>>>> matriz;
我用这个命令编译:
pgc++ -std=c++11 -acc -ta=multicore,tesla -Minfo=accel Boxcount4d.cpp -o Boxcount4d
我收到此错误:
"Boxcount4d.cpp",line 304: error: expected a ")"
#pragma acc parallel loop reduction (+:matriz())
^
1 error detected in the compilation of "Boxcount4d.cpp".
我不知道这是否只是一个语法错误,或者我是否必须使用这个库 https://docs.nvidia.com/cuda/thrust/index.html 因为我无法在 OpenACC 中使用 STL 向量
解决方法
由于额外的“()”,这是一个语法错误。正确的语法是:
#pragma acc parallel loop reduction (+:matriz)
不过你为什么在这里使用reduce?不需要,因为您没有尝试并行化 k 和 l 循环。
我不能在 OpenACC 中使用 STL 向量
您可以在设备代码中使用向量,但向量不是线程安全的,因此您需要小心仅使用访问运算符“[]”。此外,建议使用 CUDA 统一内存(“-ta=multicore,tesla:managed”)进行编译,因为手动尝试复制向量可能很困难。