在《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;
}
}
}
依舊還是分開編譯: deviceptr子句用來告訴編譯器變量已經存在加速器內存中。