Как правильно сделать массив приватным в openacc? для моего использования я объявил массив, который проходит через функцию рекурсии и обновляет себя. В C ++ я сделал это так,
int recursion(int array[],int i)
{
....
return array[i] = recursion(array,i);
}
int main()
{
....
for(int run=0;run<N;++run)
{
....
for(int i=0;i<some N;++i)
int f = recursion(array,i);
}
.....
}
Теперь главная проблема начинается, когда я пытаюсь сделать это параллельно, используя директивы openacc. Я хочу скопировать этот массив в параллельную область цикла таким образом, чтобы каждая банда имела копию этого массива и могла изменять свою собственную версию массива [], а не другие, использующие функцию рекурсии. То, как я пытался это сделать,
#pragma acc routine seq
int recursion(int array[],int i)
{
....
return array[i] = recursion(array,i);
}
int main()
{
....
#pragma acc data copyin(array[0:N])
#pragma acc parallel loop gang private(array[0:N])
for(int run=0;run<N;++run)
{
....
for(int i=0;i<N;++i)
{
....
int f = recursion(array,i);
}
}
}
Но похоже, что массив не передается в функцию рекурсии, так как я проверил, что он не меняется. Каков идеальный способ сделать это?
постскриптум Я тоже пробовал #pragma acc data pcreate(array[0:N])
с #pragma acc parallel loop independent private(array[0:N])
но результат тот же
Вы можете найти весь код Вот. Он прекрасно работает без директив. единственное, что вам нужно изменить, это закомментировать строку curand и снять комментарий с строки rand на 251 268 строке. Пожалуйста помоги!
Закрытый массив неинициализирован, но ваш код ожидает, что они имеют начальное значение. Вы либо захотите инициализировать массивы внутри цикла, мы используем предложение firstprivate, которое инициализирует каждый приватный массив начальным значением хоста.
Кроме того, у вас есть «random» и «ptr» как в частном предложении, так и в предложении data. Вы должны удалить их из директивы data, так как это сделает их глобальными.
Рекурсия на устройстве проблематична, поскольку на GPU очень маленький стек (8 МБ). Вы можете увеличить это значение, установив для переменной среды PGI «PGI_CUDA_STACKSIZE» более высокое значение, но при слишком глубоком повторении произойдет сбой программы.
Я пытался запустить вашу программу, но она продолжала давать ошибки, предположительно из-за переполнения стека. Я не был уверен, какие входные значения использовать, так что это также может быть ошибкой пилота с моей стороны.
Если использование «firstprivate» не помогает, пожалуйста, дайте мне знать, какие входные значения использовать, и я рассмотрю его подробнее.
Других решений пока нет …