如何将OpenACC数据区域用于结构化数据



我是OpenACC的新手。我有一个与使用#pragma acc data指令的结构化数据传输有关的查询。根据现场https://docs.computecanada.ca/wiki/OpenACC_Tutorial_-_Data_movement

数据指令定义了一个代码区域,其中GPU阵列保留在GPU上,并在该区域中的所有内核之间共享

我确实理解copy子句的用法。我想知道这个指令是否可以在没有任何条款的情况下使用?

我阅读了OpenACC 2.7规范。本部分不清楚条款是否为强制性。我的理解是,如果在没有明确指定任何数据的情况下定义数据区域,那么该区域内使用的所有数据将在整个数据区域内隐含地保留在GPU上。

#pragma acc data
{
#pragma acc kernels 
// Kernel 1
#pragma acc kernels
// Kernel 2
}

这意味着,对于上述代码,内核1和内核2中使用的所有数据将在数据区域的整个持续时间内保留在GPU上。

如果我错了,请纠正我。

提前谢谢。

作为并行结构的一部分,存在隐式数据区域(即"并行"或"内核"区域的一部分的数据区域(,编译器将尝试在已知数据大小和形状的情况下将数据隐式复制到设备。否则,您确实需要使用数据子句来定义形状和大小。

对于其他数据区域构造(结构化、非结构化和声明(,您确实需要将设备上所需的变量包含在数据子句中,其中数据子句可以是copy、copyin、copyout、create、present或deviceptr(或delete For exit data directions(。编译器不能假设你在设备上想要什么数据,所以通常不会为你隐式复制它。

最新更新