这是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
}
以下方法给出了编译器错误“ PGCC-S-1000-Call in 没有ACC例程的过程'_Znam'的OpenACC区域 信息”,但如果我用C样式分配替换“新” (即malloc)可以正常编译。这是可以预期的吗?一世 使用PGI版本18.1
使用较大的私有变量(例如Sn)是否安全?
答案 0 :(得分:1)
“ _ Znam”是新运算符的错误名称,该运算符没有设备端等效项。但是,有一个CUDA设备malloc例程及其起作用的原因。
但是,我强烈建议您不要执行设备端动态分配。除了速度很慢之外,设备堆还很小(默认为8MB左右)。虽然可以通过设置PGI环境变量“ PGI_ACC_CUDA_HEAPSIZE”来增加此值,但最大值仍然只有32MB左右。 (请注意,我有一段时间没有测试最大设备堆大小,因此可能有所增加,但是我仍然不建议进行设备端分配。)
是的,如果未指定并行级别,则PGI将默认使用“ seq”。
答案 1 :(得分:0)
您需要在acc routine
编译指示中提供一定程度的并行性。看来您的情况下正确的用法是acc routine seq
,因为它不包含要并行化的循环。