常规指令中的PGI编译器问题

时间:2018-08-08 20:45:09

标签: gpu openacc pgi

这是C ++ develoepd muti-gpu代码的一部分。 我正在尝试OPENACC = 0

的CPU版本
#if (OPENACC==1)
    #pragma acc routine
#endif
        void myCass::method( int i, int j, int dir, int index )
         {     
           #if (OPENACC==1)
           double Sn[ZSIZE];
           #else 
           double *Sn=new double[ZSIZE] (double *Sn=()malloc(ZSIZE))
           #endif
        }
  1. 以下方法给出了编译器错误“ PGCC-S-1000-Call in 没有ACC例程的过程'_Znam'的OpenACC区域 信息”,但如果我用C样式分配替换“新” (即malloc)可以正常编译。这是可以预期的吗?一世 使用PGI版本18.1

  2. 使用较大的私有变量(例如Sn)是否安全?

2 个答案:

答案 0 :(得分:1)

“ _ Znam”是新运算符的错误名称,该运算符没有设备端等效项。但是,有一个CUDA设备malloc例程及其起作用的原因。

但是,我强烈建议您不要执行设备端动态分配。除了速度很慢之外,设备堆还很小(默认为8MB左右)。虽然可以通过设置PGI环境变量“ PGI_ACC_CUDA_HEAPSIZE”来增加此值,但最大值仍然只有32MB左右。 (请注意,我有一段时间没有测试最大设备堆大小,因此可能有所增加,但是我仍然不建议进行设备端分配。)

是的,如果未指定并行级别,则PGI将默认使用“ seq”。

答案 1 :(得分:0)

您需要在acc routine编译指示中提供一定程度的并行性。看来您的情况下正确的用法是acc routine seq,因为它不包含要并行化的循环。