2017-03-02 137 views
0

在OpenMP中,人们可以通过共享变量和OpenACC的

#pragma omp parallel for shared(foo) private(bar) 

使用共享在一个循环变量在OpenACC的,我们有一个private条款,但没有shared子句。另一方面有数据条款,如copy,copyin,copyout

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

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

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

回答

1

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

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

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

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

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