如何将 reduce OpenACC 指令应用于多维向量?

问题描述

我正在尝试使用 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”)进行编译,因为手动尝试复制向量可能很困难。