微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 pgc++ 编译器禁用 OpenACC 隐式编译指示

如何解决使用 pgc++ 编译器禁用 OpenACC 隐式编译指示

我在一些使用 OpenACC 指令的 C++ 代码上使用了 pgc++ 编译器,我想知道是否有一个编译器选项来禁用在编译代码时执行的隐式编译指示,如果用户离开所需的编译指示出来。例如,当我使用 -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

但不幸的是,这些并没有禁用隐式编译指示生成

解决方法

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

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

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。