【问题标题】:Private Array that goes through recursion for each gang in openacc对 openacc 中的每个 gang 进行递归的私有数组
【发布时间】:2018-04-12 20:45:19
【问题描述】:

如何在 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);
    }
  }
 }

但似乎数组没有被传递给递归函数,因为我已经检查过它没有改变。做到这一点的最佳方法是什么?

附言我也试过#pragma acc data pcreate(array[0:N])#pragma acc parallel loop independent private(array[0:N]) 但结果是一样的

你可以找到整个代码here。它在没有指令的情况下完美运行。您唯一需要更改的是用 curand 注释该行并在 251 268 行用 rand 取消注释该行。请帮忙!

【问题讨论】:

    标签: c++ parallel-processing gpu openacc pgi


    【解决方案1】:

    “私有”数组未初始化,但您的代码期望它们具有初始值。你要么想在循环中初始化数组,我们使用“firstprivate”子句,它将使用主机的初始值初始化每个私有数组。

    此外,您在私有子句和数据子句中都有“random”和“ptr”。您应该从 data 指令中删除它们,因为这会使它们成为全局的。

    设备上的递归存在问题,因为 GPU 上的堆栈非常小 (8MB)。您可以通过将PGI环境变量“PGI_CUDA_STACKSIZE”设置为更大的值来增加这个值,但是如果递归太深,程序会崩溃。

    我尝试运行您的程序,但它一直出错,可能是由于堆栈溢出。我不确定要使用什么输入值,因此也可能是我的飞行员错误。

    如果使用“firstprivate”没有帮助,请告诉我要使用的输入值,我会进一步研究。

    【讨论】:

    • 您可以使用种子 3 顶点编号 20000 订单编号 2 集合编号 25000 文件编号 1 如果您想查看保存在文件中的输出,可以取消注释文件末尾的 fout 部分
    • 使用 firstprivate 没有帮助,从数据指令中删除 'random' 和 'ptr' 也没有帮助。
    • 如果你想加快执行速度,你也可以将顶点数设为 5000,它会创建 3 个文件,你需要在代码最后部分的 fout 之前取消注释“cout”才能看到终端里的数据,谢谢你的帮助,意义重大
    • 您遇到的实际错误是什么?当我在 GPU 上运行时,代码因非法内存地址而崩溃,在这种情况下,这向我表明代码正在发生堆栈溢出。当然,这个错误可能有其他原因,但在这种情况下是最可能的原因。
    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2018-07-11
    • 2020-02-15
    • 2021-10-20
    • 2015-12-30
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多