如何使用OpenACC数据区域来处理结构化数据?

问题描述 投票:0回答:1

我是OpenACC的新手。我有一个与结构化数据传输有关的查询,使用了 #pragma acc data 指令。根据该网站 https:/docs.computecanada.cawikiOpenACC_Tutorial_-_Data_movement。

数据指令定义了一个代码区域,在这个区域中,GPU数组仍然在GPU上,并且在该区域的所有内核中共享。

我确实理解使用 copy 子句。我想知道这个指令是否可以不使用任何子句?

我看了OpenACC 2.7的规范。这一部分不清楚,如果子句是 强制 或不。我的理解是,如果一个数据区域在没有明确指定任何数据的情况下被定义,那么在该区域内使用的所有数据都将在整个数据区域内隐式地保留在GPU上,这意味着,对于上面的代码,Kernel 1和Kernel 2中使用的所有数据都将在整个数据区域内保留在GPU上。

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

    #pragma acc kernels
    // Kernel 2
}

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

如果我说的不对,请纠正我。

先谢谢你。

gpu data-transfer openacc
1个回答
0
投票

有隐式数据区域作为并行构造的一部分(即数据区域是 "paralllel "或 "kernels "区域的一部分),编译器将尝试隐式复制数据到设备,假设数据的大小和形状是已知的。 否则,你确实需要使用数据子句来定义形状和大小。

对于其他的数据区域构造,结构化的、非结构化的和声明的,你确实需要在数据子句中包含你想要在设备上的变量,其中数据子句可以是copy、copyin、copyout、create、present或deviceptr(或exit数据指令的delete)。 编译器无法假设你想要在设备上的数据是什么,所以一般情况下不会隐式的帮你复制。

© www.soinside.com 2019 - 2024. All rights reserved.