OpenACC與CUDA C交互(1)

目前大家對於openacc的使用還是比較獨立,也就是程序中要不就是使用openacc,要不就是使用cuda。但是結合openacc和cuda使用目前還是比較少。剛好看到幾個好的案例,這就把例子搬過來。

/*openacc_c_main.c*/  
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
  
extern void saxpy(int,float,float*,float*);  
  
int main(int argc, char **argv)  
{  
  float *x, *y, tmp;  
  int n = 1<<20, i;  
  
  x = (float*)malloc(n*sizeof(float));  
  y = (float*)malloc(n*sizeof(float));  
  
  #pragma acc data create(x[0:n]) copyout(y[0:n])  
  {  
    #pragma acc kernels  
    {  
      for( i = 0; i < n; i++)  
      {  
        x[i] = 1.0f;  
        y[i] = 0.0f;  
      }  
    }  
        
    #pragma acc host_data use_device(x,y)  
    {  
      saxpy(n, 2.0, x, y);  
    }  
  }  
  
  fprintf(stdout, "y[0] = %f\n",y[0]);  
  return 0;  
}  


/* saxpy_cuda.cu */
__global__
void saxpy_kernel(int n, float a, float *x, float *y)
{
  int i = blockDim.x * blockIdx.x + threadIdx.x;

  if ( i < n )
    y[i] += a * x[i];
}
extern "C" void saxpy(int n ,float a, float *x, float *y)
{
  dim3 griddim, blockdim;

  blockdim = dim3(128,1,1);
  griddim = dim3(n/blockdim.x,1,1);

  saxpy_kernel<<<griddim,blockdim>>>(n,a,x,y);
}

對於PGI編譯,不能識別 .cu文件。所以對於這兩個文件需要分開編譯。編譯測試平臺:linux,k20c

對於saxpy_cuda.cu 文件:

nvcc  -c saxpy_cuda.cu -arch=sm_35

對於openacc_c_main.c文件:

pgcc -c openacc_c_main.c  -acc -Mcuda=cc3.5 -Minfo
最後把生成的openacc_c_main.o和saxpy_cuda.o文件一起鏈接

pgcc -o openacc_cuda openacc_c_main.o saxpy_cuda.o -Mcuda  -acc


發佈了40 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章