OpenACC與CUDA C交互(2)

在《OpenACC與CUDA交互(1)》中,舉了一個openacc中嵌套cuda的例子。現在舉一個cuda中嵌套openacc的例子。上代碼:

/*cuda_main.cu*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <cuda_runtime.h>

extern "C" void saxpy(int,float,float*,float*);
extern "C" void set(int,float,float*);

int main(int argc, char **argv)
{
  float *x, *y, tmp;
  int n = 1<<20;

  cudaMalloc((void**)&x,(size_t)n*sizeof(float));
  cudaMalloc((void**)&y,(size_t)n*sizeof(float));

  set(n,1.0f,x);
  set(n,0.0f,y);

  saxpy(n, 2.0, x, y);
  cudaMemcpy(&tmp,y,(size_t)sizeof(float),cudaMemcpyDeviceToHost);
  printf("%f\n",tmp);
  return 0;
}



/* saxpy_openacc_c.c*/
void saxpy(int n, float a, float * restrict x, float * restrict y)
{
  #pragma acc kernels deviceptr(x,y)
  {
    for(int i=0; i<n; i++)
    {
      y[i] += a*x[i];
    }
  }
}
void set(int n, float val, float * restrict arr)
{
#pragma acc kernels deviceptr(arr)
  {
    for(int i=0; i<n; i++)
    {
      arr[i] = val;
    }
  }
}

依舊還是分開編譯:
  1. nvcc -c cuda_main.cu -arch=sm_35
  1. pgcc -o cuda_openacc cuda_main.o saxpy_openacc_c.o -Mcuda=cc3.5 -acc
deviceptr子句用來告訴編譯器變量已經存在加速器內存中。

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