Как применить директиву 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, потому что я не могу использовать векторы STL с OpenACC


person Miguel Posadas    schedule 04.03.2021    source источник


Ответы (1)


Это синтаксическая ошибка из-за дополнительного (). Правильный синтаксис:

#pragma acc parallel loop reduction (+:matriz)

Хотя, почему вы используете сокращение здесь? Это не нужно, так как вы не пытаетесь распараллелить циклы k и l.

Я не мог использовать векторы STL с OpenACC

Вы можете использовать векторы в коде устройства, хотя векторы не являются потокобезопасными, поэтому вам нужно быть осторожным и использовать только оператор доступа []. Также рекомендуется компилировать с объединенной памятью CUDA (-ta=multicore,tesla:managed), поскольку копирование векторов вручную может быть затруднено.

person Mat Colgrove    schedule 04.03.2021