【问题标题】:Disabling OpenACC implicit pragma generation with pgc++ compiler使用 pgc++ 编译器禁用 OpenACC 隐式编译指示生成
【发布时间】:2021-04-09 19:42:51
【问题描述】:

我在一些使用 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

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

【问题讨论】:

    标签: c++ compiler-errors gpu openacc pgi


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-04-10
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        • 2019-06-10
        • 2021-09-22
        相关资源
        最近更新 更多