如何在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 指令并行执行此操作时,主要问题就开始了。我想将此数组复制到并行 for 循环区域中,这样每个团伙都将拥有该数组的副本,并且能够使用递归函数更改他们自己的数组 [] 版本,而不是其他版本。我尝试这样做的方式是
#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);
}
}
}
但似乎数组没有被传递给递归函数,因为我已经检查过它没有改变。做到这一点的完美方法是什么?
ps 我也试过#pragma acc data pcreate(array[0:N])
,#pragma acc parallel loop independent private(array[0:N])
但结果是一样的
你可以在这里找到整个代码。它在没有指令的情况下完美运行。您唯一需要更改的是用 curand 注释该行,并在 251 268 行用 rand 取消注释该行。请帮忙!