【问题标题】:PGI compiler issue in routine directive例程指令中的 PGI 编译器问题
【发布时间】:2018-08-08 20:45:09
【问题描述】:

这是一段 C++ develoepd 多 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 OpenACC 区域到没有 acc 例程的过程“_Znam” 信息”,但如果我用 C 样式分配替换“新” (即 malloc )编译得很好。这是可以预料的吗?一世 使用 PGI 版本 18.1

  2. 使用像 Sn 这样的大型私有变量是否安全?

【问题讨论】:

    标签: gpu openacc pgi


    【解决方案1】:

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

    【讨论】:

    • 嗨,杰夫,感谢您的回复,我认为如果未指定,PGI 会隐含地假定顺序,对吗?
    • 可能是。如果是这样,那是非标准行为。 -Minfo=accel 将打印一行并确定地告诉您。编辑:看起来 Mat 已经确认这样做了。
    【解决方案2】:

    "_Znam" 是新操作符的错误名称,它没有等效的设备端。但是,有一个 CUDA 设备 malloc 例程及其工作原理。

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

    另外,是的,如果没有指定并行级别,PGI 将默认使用“seq”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2012-10-14
      • 1970-01-01
      相关资源
      最近更新 更多