【问题标题】:How to apply a reduce OpenACC directive to a multidimensional vector?如何将 reduce OpenACC 指令应用于多维向量?
【发布时间】:2021-06-03 09:16:15
【问题描述】:

我正在尝试使用 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];

matriz 是这样声明的:

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,因为我无法将 STL 向量与 OpenACC 一起使用

【问题讨论】:

    标签: c++ openacc


    【解决方案1】:

    由于额外的“()”,这是一个语法错误。正确的语法是:

    #pragma acc parallel loop reduction (+:matriz)
    

    虽然你为什么在这里使用减少?不需要,因为您没有尝试并行化 k 和 l 循环。

    我不能在 OpenACC 中使用 STL 向量

    您可以在设备代码中使用向量,尽管向量不是线程安全的,因此您需要小心只使用访问运算符“[]”。此外,建议使用 CUDA 统一内存(“-ta=multicore,tesla:managed”)进行编译,因为手动尝试复制向量可能很困难。

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 2013-11-21
      • 2020-11-16
      • 1970-01-01
      • 2022-01-20
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多