OpenACC——异步操作(async子语、wait子语、wait导语)

1、async子语:

async子语可以出现在parallel构件或者kernels构件上,也可以出现在enter data、exit data、update、wait导语上。没有async子语的时候,在执行任何后续代码之前,主机线程会一直等待直至计算构件结束或者数据操作完成;如果有async子语,在主机线程继续执行构件或导语后面代码的同时,parallel、kernels构件区域或数据操作可以被异步地处理。

2、wait子语:

wait子语可以出现在parallel构件或者kernels构件上,也可以出现在enter data、exit data、update导语上。没有wait子语时,在设备上,关联的计算操作或更新操作会被立即压入队列、启动或执行;如果有wait子语,计算、数据更新操作可能不会被立即启动或执行,直到本线程在这个位置前压入关联异步设备活动队列的所有操作都已经完成。

3、wait导语:

 wait导语将引发主机线程等待,直到在此之前压入队列的所有相关异步活动都已经完成。保证其他线程压入队列的操作已经完成,要求在那些线程间进行额外的同步操作。

示例代码:

#include<iostream>
#include<stdlib.h>
int main()
{
    int N = 10240000, M = 200;
    int *a, *b, *c;
    a = (int*)malloc(sizeof(int)*N);
    b = (int*)malloc(sizeof(int)*N);
    c = (int*)malloc(sizeof(int)*N);
    #pragma acc enter data create(a[0:N]) async
    for (int j=1; j<=M; j++)
        #pragma acc parallel loop async
        for(int i=0; i<M; i++)
            a[i] = (i + j)/2;
     
    for(int j=1; j<=M; j++)
        for(int i=0; i<N; i++)
            b[i] =(i+j)/3;
    #pragma acc update host(a[0:N]) async
    #pragma acc wait
            
    for(int i=0; i<N; i++)
        c[i] = a[i] + b[i];
    #pragma acc update device(a[0:N])
    #pragma acc exit data delete(a[0:N])
    std::cout<<"c[1] = "<<c[1]<<std::endl;
    free(a);
    free(b);
    free(c);
    return 0;
}

主机将第10~14行对应的内核提交给默认的队列后,立即返回,接着继续执行第16~18行的代码。第19行update导语上添加async子语,是为了防止进行立即传输,避免未完成赋值的变量复制到主机上。第20行的wait导语让程序在此等待,直到多有异步队列中的所有操作都完成。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenACC是一种用于并行计算的编程模型,常用于加速CPU和GPU上的科学计算、机器学习等应用。以下是一些常用的OpenACC语句: 1. `#pragma acc parallel`:用于在CPU或GPU上创建并行区域。 2. `#pragma acc kernels`:用于在GPU上并行执行内核函数。 3. `#pragma acc loop`:用于在循环中并行化迭代。 4. `#pragma acc data`:用于在设备和主机之间传输数据。 5. `#pragma acc update`:用于在设备和主机之间更新数据。 6. `#pragma acc atomic`:用于在并行环境下对共享变量进行原子操作。 7. `#pragma acc cache`:用于指定数据在缓存中的存储方式。 这些语句可以根据具体应用的需求进行灵活地组合和使用。 ### 回答2: OpenACC是一种并行计算模型,常用于GPU加速计算。以下是一些常用的OpenACC语句: 1. `#pragma acc parallel loop`: 声明一个并行循环,将循环迭代并行化,使得循环中的迭代可以同时在GPU上执行。 2. `#pragma acc data`: 声明数据区域,用于将数据从主机内存传输到GPU内存,也可以将数据从GPU内存传输回主机内存。 3. `#pragma acc kernels`: 将下面的代码块标记为并行代码,让OpenACC将其编译为可以在GPU上并行执行的代码。 4. `#pragma acc routine`: 声明一个函数,使其能够在GPU上运行。 5. `#pragma acc loop seq`: 声明一个串行循环,即不在GPU上并行执行循环迭代。 6. `#pragma acc parallel`: 声明一个并行区域,将下面的代码块标记为可以并行执行的。 7. `#pragma acc enter data` 和 `#pragma acc exit data`: 用于手动控制数据在主机内存和GPU内存之间的传输,分别用于将数据传输到GPU和从GPU传输回主机。 8. `#pragma acc update`: 用于数据传输的指令,可以将数据从主机内存传输到GPU或从GPU传输回主机。 9. `#pragma acc atomic`: 用于确保对共享变量的原子操作,以避免多个线程同时访问造成的竞态条件。 以上是一些OpenACC常用语句的示例。根据具体的应用场景和需求,还可以使用更多的OpenACC指令来实现更复杂的并行计算任务。 ### 回答3: OpenACC是一种并行编程模型,用于在GPU上并行执行计算。在OpenACC中,常见的语句包括: 1. `#pragma acc parallel loop`:并行循环指令,用于将循环迭代分配到GPU上并行执行。 2. `#pragma acc parallel`:并行指令,用于将代码块分配到GPU上并行执行。 3. `#pragma acc loop`:循环指令,指示循环迭代可被并行执行。 4. `#pragma acc data`:数据指令,用于管理GPU内存的数据传输和复制。 5. `#pragma acc data copyin(array)`:数据指令,将数组从主机内存复制到GPU内存,并在计算结束后将结果从GPU内存复制回主机内存。 6. `#pragma acc data copy(array)`:数据指令,将数组从主机内存复制到GPU内存,并不将结果从GPU内存复制回主机内存。 7. `#pragma acc update host(array)`:数据指令,将数组从GPU内存复制回主机内存。 8. `#pragma acc update device(array)`:数据指令,将数组从主机内存复制到GPU内存。 9. `#pragma acc kernels`:指示下面的代码段在GPU上执行。 10. `#pragma acc routine(func)`:将函数标记为可在GPU上执行的设备代码。 这些是OpenACC中常见的语句,用于在GPU上实现并行计算。使用这些语句可以将代码分解成可以在不同线程上并行执行的任务,以提高计算性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值