使用 pgc++ 编译器禁用 OpenACC 隐式 pragma 生成

Disabling OpenACC implicit pragma generation with pgc++ compiler

我在一些使用 OpenACC 指令的 C++ 代码上使用 pgc++ 编译器,我想知道是否有一个编译器选项可以禁用在用户离开时编译代码时执行的隐式 pragma 生成所需的编译指示。例如,当使用 -Minfo=accel 标志编译我自己的代码时,我看到出现以下消息:

Generating implicit copy(beam_endpoint_grid_idx,beam_endpoint_world_frame[:]) [if not already present]
Generating implicit copyin(R[:][:]) [if not already present]
Generating implicit copyin(this[:],particle_position_world_frame[:]) [if not already present]

我想做的是阻止 pgc++ 编译器生成这些隐式的 copy()copyin() 等编译指示,而是抛出错误。有这样的选择吗?

pgc++ man page 中进行搜索,在其名称或描述中包含 implicit 一词的唯一选项是,

--implicit_include (default) --no_implicit_include
--implicit_typename (default) --no_implicit_typename
--using_std (default) --no_using_std

但不幸的是,这些并没有禁用隐式 pragma 生成。

这是 OpenACC 标准定义的当用户不在计算结构上使用数据子句时的默认行为 (parallel/kernels)。执行运行时检查,如果数据已存在于设备上,则不执行任何操作。如果数据不在设备上,则复制数据。

您可以将这些变量单独添加到数据子句中,或将“默认(存在)”子句添加到您的计算构造中,以便假定所有共享数据都存在于设备上。如果数据不存在,则会发生运行时错误。

正如@Mat Colgrove 指出的那样,编译器为未出现在一个变量中的变量隐式添加数据子句是预期的行为。您可以将 default(none) 添加到您的编译指示中,这将指示编译器在区域内使用变量且未出现在数据子句中时给出编译时错误。不过,我不知道在整个程序范围内执行此操作的编译器选项。