OpenACC——数据管理(data构件、enter data和exit data、update导语、declare导语)

1、data构件:

在进入data构件区域时,无论是否需要将数据从主机复制到设备内存上,在离开本data构件区域时,无论是否需要将数据从设备复制到主机上,在data区域持续期间,data构件指定的标量、数组和子数组都会在设备内存上拥有空间。这样可以避免数据在设备和主机上来回传输。

示例代码:

#include<iostream>
using namespace std;
#define N 256
int main()
{
    int i, a[N], b[N];
    for(i = 0; i < N; i++)
    {
        a[i] = b[i] = 0;
    }
    #pragma acc kernels
    for(i=1; i <N; i++)
    {
        a[i] = b[i] = a[i] + i;
    }
    #pragma acc kernels
    for(i=1; i <N; i++)
    {
        a[i] = b[i] = a[i] - i;
    }
    for(i = 0; i < N; i++)
    {
       a[i] = b[i] = 0; 
    }
    #pragma acc data copy(a,b)
    {
        #pragma acc kernels
        for(i=1; i <N; i++)
        {
            a[i] = b[i] = a[i] + i;
        }
        #pragma acc kernels
        for(i=1; i <N; i++)
        {
            a[i] = b[i] = a[i] - i;
        }
    }
    return 0;
}

编译信息:

main:
     12, Loop is parallelizable
         Generating Tesla code
         12, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
     12, Generating implicit copyout(b[1:]) [if not already present]
         Generating implicit copy(a[1:]) [if not already present]
     17, Loop is parallelizable
         Generating Tesla code
         17, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
     17, Generating implicit copyout(b[1:]) [if not already present]
         Generating implicit copy(a[1:]) [if not already present]
     26, Generating copy(b[:],a[:]) [if not already present]
     28, Loop is parallelizable
         Generating Tesla code
             28, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
     33, Loop is parallelizable
         Generating Tesla code
         33, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */

从编译信息可以看出,在没有使用data构件的情况下,一共进行了四次数据传输(二进,二出),在使用data构件的情况下,只有两次的数据传输(一进,一出)。

2、enter data导语和exit data导语:

enter data编译制导语句可以定义在设备上分配空间的标量、数组和子数组,这些数据在程序的持续期内一直存在,直到遇到exit data 编译制导语句释放数据。enter data 导语和exit data导语之间的程序范围就是定义的数据的生存期。

示例代码:

#pragma acc enter data 子语

代码块

#pragma acc exit data 子语

3、update导语:

在设备数据的生存期间,update导语将从设备内存中取出相应的值,更新主机相应变量的值;或者从主机内存中取出相应的值,用来更新设备上相应变量的值。

3.1 self子语:

将设备内存中的数据复制道主机内存,数据更新顺序与在子语中出现的顺序一致。

3.2 device子语:

将主机内存的数据复制到设备内存,数据更新顺序与在子语中出现的顺序一致。

3.3 host子语:

host子语与self子语时同义词。

4、declare导语:

 declare导语跟在变量声明之后,指定的变量需要在设备内存上开辟空间,即这个导语为变量创建一个设备副本,设备副本的生存期与主机变量相同。

4.1 device_resident子语:

要求指定的变量需要在设备内存上开辟空间,且不在主机内存上开辟空间。

4.2 create子语:

如果变量已经存在在设备上,那么不会分配数据空间,也不会从主机复制数据到设备;如果变量不在设备上,那么为变量在设备上分配内存,也不必从主机复制数据到设备。

4.3 link子语:

link子语指定的主机全局变量,在设备创建一个全局链接。主机端的数据仍然可用,仅当全局变量出现在data构件,计算构件等中时,才有必要用到link子语。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值