#include<stdio.h>
#include<openacc.h>
#include<omp.h>
#include <sys/time.h>
#define LEN 100
int main(int argc,char**argv)
{
int a[2][LEN];
for(int i=0;i<2;i++){
for(int k=0;k<LEN;k++){
a[i][k]=2;
}
}
#pragma omp parallel num_threads(2)
{
int th= omp_get_thread_num();
acc_set_device_num(th,acc_device_nvidia);
int index=acc_get_device_num(acc_device_nvidia);
#pragma acc kernels
for(int j=0;j<LEN;j++){
a[th][j]=index;
}
}
for(int i=0;i<10;i++){
printf("a[0][%d]=%d\ta[1][%d]=%d\n",i,a[0][i],i,a[1][i]);
}
return 0;
}
这个例子比较简单,cpu端通过OpenMP启动两个线程,每个线程控制一个GPU。通过OpenACC的运行时库acc_set_device_num,来设置使用哪一个GPU。acc_get_device_num来获得使用GPU的ID。
程序输出结果:
a[0][0]=0 a[1][0]=1
a[0][1]=0 a[1][1]=1
a[0][2]=0 a[1][2]=1
a[0][3]=0 a[1][3]=1
a[0][4]=0 a[1][4]=1
a[0][5]=0 a[1][5]=1
a[0][6]=0 a[1][6]=1
a[0][7]=0 a[1][7]=1
a[0][8]=0 a[1][8]=1
a[0][9]=0 a[1][9]=1