【问题标题】:Shared variables and OpenACC共享变量和 OpenACC
【发布时间】:2017-03-04 00:43:38
【问题描述】:

在 OpenMP 中,可以通过

在循环中使用共享变量
#pragma omp parallel for shared(foo) private(bar)

在 OpenACC 中,我们有一个 private 子句,但没有 shared 子句。另一方面有copycopyincopyout等数据子句。

有时,我们使用加速器,它们有自己的私有内存,但也可以访问公共内存。

在这种情况下,我们可能希望加速器避免将数据复制到自己的私有内存中,而是对公共内存中的实例进行操作。

我们如何告诉 OpenACC 不要复制数据?

【问题讨论】:

    标签: openacc


    【解决方案1】:

    请注意,数组默认是共享的。

    “创建”数据子句将在设备上创建数据但不执行复制。

    如果您想使用已经在设备上创建的数据,例如通过调用 cudaMalloc 或 acc_malloc,您可以使用“deviceptr”数据子句告诉编译器在设备代码中使用指针的地址而不是查看-使用主机地址向上移动当前表中的设备指针。

    如果要将设备变量与主机变量相关联,可以使用 API 调用“acc_map_data”。

    听起来你有更大的内存池,然后你想重用。在这种情况下,您可以使用 OpenACC 数据子句、cudaMalloc 或 acc_malloc 创建内存池。如果使用数据子句,则调用“acc_deviceptr”来获取设备指针地址。接下来,您可以使用“acc_map_data”将主机指针与设备指针相关联。请注意,映射的数据可以是较大设备池的子集,您可以映射到偏移量,即“devptr+offset”。

    有关使用“acc_map_data”的示例,请参阅:https://github.com/rmfarber/ParallelProgrammingWithOpenACC/blob/master/Chapter05/acc_map.c

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2012-07-21
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多