共享变量和OpenACC

时间:2017-03-02 22:33:48

标签: openacc

在OpenMP中,可以通过

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

请注意,默认情况下共享数组。

“create”数据子句将在设备上创建数据但不执行副本。

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

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

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

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