OpenACC——#pragma acc parallel

#pragma acc parallel:

1、遇到一个parallel构件时,程序就创建一个或多个gang来执行这个并行区域。

2、parallel区域结束时,会有一个隐式的同步障碍,线程到此等待,直到所有的线程到达此处。

3、parallel导语自动探测结构块代码内的并行性,存在数据依赖时拒绝并行化。

4、在没有loop导语的情况下,parallel只有一个gang来进行并行化。在使用loop导语的情况下,默认数据是没有依赖的,如果确实存在数据依赖,那后果自负。

5、在一个parallel区域内不管有多少个循环,都只会编译成一个CUDA内核,也就是不管每个循环的迭代次数是否相等,都是采用相同的并行参数。

1、单重循环:

1.1 只有一个gang

示例代码:

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

反馈信息:

可以看出,num_gangs=1,确实只有一个gang。

1.2 使用loop制导语句,可以使用多个gang进行并行。

示例代码:

#include <iostream>
using namespace std;
#define N 256
int main()
{
	int i, a[N], b[N], c[N];
	for(i = 0; i < N; i++)
	{
        a[i] = -1;
        b[i] = c[i] = i;
	}
	#pragma acc parallel
    #pragma acc loop
    for(i=0; i < N; i++)
    {
        a[i] = b[i] + c[i];
    }    
	cout << "a[N-1]=" << a[N-1] << endl;
   return 0;
}

 反馈信息:

 从上面可以看出,num_gangs = 2,并行使用的gang多了。

1.3 区域内多个循环采用相同的并行参数

示例代码:

#include <iostream>
using namespace std;
#define N 256
int main()
{
	int i, a[N], b[N], c[N];
	for(i = 0; i < N; i++)
	{
        a[i] = -1;
        b[i] = c[i] = i;
	}
	#pragma acc parallel
    {
        for(i=0; i < N; i++)
        {
            a[i] = c[i] + 1;
        }  
        for(i=0; i < N; i++)
        {
            b[i] = c[i] + 2;
        }  
    }
      
	cout << "a[N-1]=" << a[N-1] << endl;
   return 0;
}

反馈信息:

从反馈信息可以看出,两个循环使用了相同的参数。 

2、双重循环:

2.1 只用parallel:

示例代码:

#include <iostream>
using namespace std;
#define N 256
#define M 128
int main()
{
	int i, j, a[M][N], b[M][N], c[M][N];
	for(i = 0; i < M; i++)
	{
        for(j = 0; j < N; j++)
        {
            a[i][j] = -1;
            b[i][j] = c[i][j] = i+j;
        }
	}
	#pragma acc parallel
    for(i=0; i < M; i++)
    {
        for(j = 0; j < N; j++)
        {
            a[i][j] = b[i][j] + c[i][j];
        }
    }
        
	cout << "a[M-1][N-1]=" << a[M-1][N-1] << endl;
   return 0;
}

编译信息:

可以看出,内层循环被并行化执行。

2.2 加loop导语:

示例代码:

#include <iostream>
using namespace std;
#define N 256
#define M 128
int main()
{
	int i, j, a[M][N], b[M][N], c[M][N];
	for(i = 0; i < M; i++)
	{
        for(j = 0; j < N; j++)
        {
            a[i][j] = -1;
            b[i][j] = c[i][j] = i+j;
        }
	}
	#pragma acc parallel
    #pragma acc loop
    for(i=0; i < M; i++)
    {
        for(j = 0; j < N; j++)
        {
            a[i][j] = b[i][j] + c[i][j];
        }
    }
        
	cout << "a[M-1][N-1]=" << a[M-1][N-1] << endl;
   return 0;
}

编译信息:

可以看出,双层循环都被并行执行,是按照一维组织的。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值