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子句用来告诉编译器变量已经存在加速器内存中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值