在OpenMP中,可以通过以下方式在循环中使用共享变量
#pragma omp parallel for shared(foo) private(bar)在OpenACC中,我们有一个private子句,但没有shared子句。另一方面,还有copy、copyin、copyout等数据子句。
有时,我们使用加速器,它们有自己的私有内存,但也可以访问公共内存。
在这种情况下,我们可能希望加速器避免将数据复制到它自己的私有内存中,而是在公共内存中的实例上操作。
我们如何告诉OpenACC不要复制数据呢?
发布于 2017-03-04 00:43:39
请注意,默认情况下,数组是共享的。
" create“data子句将在设备上创建数据,但不执行复制。
如果您想使用已经在设备上创建的数据,例如通过调用cudaMalloc或acc_malloc,您可以使用"deviceptr“data子句告诉编译器在设备代码中使用指针的地址,而不是使用主机地址在当前表中查找设备指针。
如果您想关联设备变量和主机变量,可以使用acc_map_data接口调用。
听起来你有更大的内存池,然后你想要重用它。在这种情况下,您可以使用OpenACC data子句、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
https://stackoverflow.com/questions/42567288
复制相似问题