▶ 按照书上的代码完成了 OpenACC 与CUDA 的相互调用,以及 OpenACC 调用 cuBLAS。便于过程遇到了很多问题,注入 CUDA 版本,代码版本,计算能力指定等,先放在这里,以后填坑。

● 代码,OpenACC 调用 CUDA

 // kernel.cu
__global__ void saxpy_kernel(const int n, const float a, float *x, float *y)
{
int id = blockIdx.x * blockDim.x + threadIdx.x;
if (id < n)
y[id] += a * x[id];
} extern "C" void saxpy(const int n, const float a, float *x, float *y)
{
saxpy_kernel << < (n + - ) / , >> > (n, a, x, y);
} // main.c
#include <stdio.h>
#include <stdlib.h> #define N 1024 #pragma acc routine seq
extern void saxpy(int n, float a, float *x, float *y); int main()
{
float *x = (float *)malloc(sizeof(float)*N);
float *y = (float *)malloc(sizeof(float)*N); #pragma acc data create(x[0:N]) copyout(y[0:N])
{
#pragma acc kernels
#pragma acc loop independent
for (int i = ; i < N; i++)
{
x[i] = 1.0f;
y[i] = 4.0f;
}
#pragma acc host_data use_device(x, y)
saxpy(N, 2.0f, x, y);
}
#pragma wait printf("\ny[0] = %f\n", y[]);
free(x);
free(y);
//getchar();
return ;
}

● 输出结果,代码在 win10上不能链接,报错:LINK : fatal error LNK1104: 无法打开文件“libcudapgi.lib”,WSL上输出结果不正确,在 Ubuntu 中报链接错误。参考了 参考https://blog.csdn.net/wcj0626/article/details/12611689?locationNum=12&fps=1 和 https://stackoverflow.com/questions/31737024/openacc-calling-cuda-device-kernel-from-openacc-parallel-loop,还是没有解决问题

WSL:
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ nvcc -c kernel.cu -rdc=true
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ pgcc -acc -c main.c
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ pgcc -ta=tesla:rdc,cuda9. -Mcuda -o acc.exe main.o kernel.o
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ ./acc.exe y[] = 4.000000 Ubuntu:
@E@nvlink fatal : elfLink fatbinary error
pgacclnk: child process exit status : /usr/local/pgi/linux86-/18.4/bin/pgnvd

● 代码,OpenACC 调用 CUDA

 // fun.c
void set(const int n, const float c, float *x)
{
#pragma acc kernels deviceptr(x)
for (int i = ; i < n; i++)
x[i] = c;
} void saxpy(const int n, const float a, float *restrict x, float *restrict y)
{
#pragma acc kernels deviceptr(x, y)
for (int i = ; i < n; i++)
y[i] += a * x[i];
} // main.cu
#include <stdio.h>
#include <cuda.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h" #define N 1024 extern "C" void set(int, float, float *);
extern "C" void saxpy(int, float, float *, float *); int main()
{
float *x, *y, y0;
cudaMalloc((void**)&x, sizeof(float)*N);
cudaMalloc((void**)&y, sizeof(float)*N); set(N, 1.0f, x);
set(N, 0.0f, y);
saxpy(N, 2.0f, x, y);
cudaMemcpy(&y0, y, sizeof(float), cudaMemcpyDeviceToHost); printf("\ny[0] = %f\n", y0);
cudaFree(x);
cudaFree(y);
//getchar();
return ;
}

● 输出结果,代码在 win10上不能链接,WSL 和 Ubuntu 中报链接错误

WSL:
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ nvcc -c main.cu -rdc=true
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ pgcc -acc -c fun.c
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ pgcc -ta=tesla:rdc,cuda9. -Mcuda -o acc.exe main.o fun.o
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ ./acc.exe
Segmentation fault (core dumped) Ubuntu:
cuan@CUAN:~/Temp$ nvcc -c main.cu -rdc=true
cuan@CUAN:~/Temp$ pgcc -acc -c fun.c
cuan@CUAN:~/Temp$ pgcc -ta=tesla:rdc,cuda9. -Mcuda -o acc.exe main.o fun.o
@E@nvlink fatal : elfLink fatbinary error
pgacclnk: child process exit status : /usr/local/pgi/linux86-/18.4/bin/pgnvd

● 代码,CUDA 调用 OpenACC,捆绑变量地址

 // fun.c
#include <openacc.h> void map(float *restrict pHost, float *restrict pDevice, int sizeByte)
{
acc_map_data(pHost, pDevice, sizeByte);
} void set(int n, float c, float *x)
{
#pragma acc kernels present(x)
for (int i = ; i < n; i++)
x[i] = c;
} void saxpy(int n, float a, float *restrict x, float *restrict y)
{
#pragma acc kernels deviceptr(x,y)
for (int i = ; i < n; i++)
y[i] += a * x[i];
} // main.cu
#include <stdio.h>
#include <stdlib.h> #define N 1024 extern "C" void map(float *, float *, int);
extern "C" void set(int, float, float *);
extern "C" void saxpy(int, float, float *, float *); int main()
{ float *x = (float *)malloc(sizeof(float)*N);
float *y = (float *)malloc(sizeof(float)*N);
float *dx, *dy, y0;
cudaMalloc((void**)&dx, sizeof(float)*N);
cudaMalloc((void**)&dy, sizeof(float)*N); map(x, dx, sizeof(float)*N);
map(y, dy, sizeof(float)*N);
set(N, 1.0f, x);
set(N, 4.0f, y);
saxpy(N, 2.0f, x, y);
cudaMemcpy(&y0, y, sizeof(float), cudaMemcpyDeviceToHost); printf("\ny[0] = %f\n",y0);
free(x);
free(y);
cudaFree(x);
cudaFree(y);
//getchar();
return ;
}

● 输出结果,代码在 win10上不能链接,在 WSL 上结果正确,在 Ubuntu 中未尝试

WSL:
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ nvcc -c main.cu -rdc=true
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ pgcc -c fun.c -acc
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ pgcc -acc -Mcuda -o acc.exe main.o fun.o -ta=tesla:rdc,cuda9.
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ ./acc.exe y[] = 6.000000

● 代码,OpenACC 调用 cuBLAS

 #include <stdio.h>
#include <stdlib.h> #define N 1024 extern void cublasSaxpy(int, float, float *, int, float *, int); int main()
{
float *x = (float *)malloc(sizeof(float)*N);
float *y = (float *)malloc(sizeof(float)*N); #pragma acc data create(x[0:N]) copyout(y[0:N])
{
#pragma acc kernels
for (int i = ; i < N; i++)
{
x[i] = 1.0f;
y[i] = 4.0f;
}
#pragma acc host_data use_device(x,y)
{
cublasSaxpy(N, 2.0f, x, , y, );
}
} printf("\ny[0] = %f\n", y[]);
free(x);
free(y);
//getchar();
return ;
}

● 输出结果,代码在 win10上不能链接,在 WSL 中结果错误,在 Ubuntu 中结果正确

WSL:
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ nvcc -c fun.c -rdc=true
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ pgcc -acc -c main.c
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ pgcc -acc -Mcuda -lcublas -o acc.exe main.o
cuan@CUAN:/mnt/d/Code/CUDA/cudaProject/cudaProject$ ./acc.exe y[] = 4.000000 Ubuntu:
cuan@CUAN:~/Temp$ nvcc -c fun.c -rdc=true
cuan@CUAN:~/Temp$ pgcc -acc -c main.c
cuan@CUAN:~/Temp$ pgcc -acc -Mcuda -lcublas -o acc.exe main.o
cuan@CUAN:~/Temp$ ./acc.exe y[] = 6.000000

OpenACC 与 CUDA 的相互调用的更多相关文章

  1. Android和JavaScript相互调用的方法

    转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...

  2. 多个Activity相互调用和Intent

    MainActivity.java和OtherActivity.java的相互调用 首先MainActivity.java是Android程序自带的,新建一个类OtherActiviy extends ...

  3. JS代码和OC代码的相互调用

    JS调用OC 很多应用里面或多或少的调用了网页,来达到绚丽的效果,所谓的JS调用OC.....举个例子吧,网页上有个按钮 点击按钮跳转界面,跳转的动作由OC的代码实现. OC调用JS 还是举个例子,我 ...

  4. C程序与Lua脚本相互调用

    Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows ...

  5. Unity3D中C#和js方法相互调用

    通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...

  6. Unity3d 脚本相互调用

    unity中三种调用其他脚本函数的方法 第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用…… 第二种,GameObject.Find("脚本所在物体名& ...

  7. Lua与C++相互调用

    {--1.环境--} 为了快速入手,使用了小巧快速的vc++6.0编译器 以及在官网下载了Lua安装包..官网地址{--http://10.21.210.18/seeyon/index.jsp--} ...

  8. 关于action script与js相互调用的Security Error问题

    大家都知道,as和js相互调用可以通过ExternalInterface.call和ExternalInterface.addCallback来进行. 比较好的做法是使用之前通过ExternalInt ...

  9. Java与.NET 的Web Services相互调用

    一:简介 本文介绍了Java与.NET开发的Web Services相互调用的技术.本文包括两个部分,第一部分介绍了如何用.NET做客户端调用Java写的Web Services,第二部分介绍了如何用 ...

随机推荐

  1. POI解析excel格式的文件(xls,xlsx)

    先贴出所需的jar包: 1.poi-3.17-beta1.jar 2.poi-ooxml-3.17-beta1.jar 3.poi-ooxml-schemas-3.17-beta1.jar 4.com ...

  2. python list 的查找, 搜索, 定位, 统计

    Python中是有查找功能的,四种方式:in.not in.count.index,前两种方法是保留字,后两种方式是列表的方法. 下面以a_list = ['a','b','c','hello'],为 ...

  3. MySQL--DROP TABLE与MySQL版本

    ======================================================================== DROP TABLE与MySQL版本 MySQL在5. ...

  4. nginx unit nodejs 模块试用

      unit 对于nodejs 的支持是在10.25 发布的,基本能用,但是依然有好多问题,当前在测试的时候就发现,请求之后会block , 相关的issue 已经有人反馈了,最好使用源码编译,方便测 ...

  5. 单变量微积分笔记21——三角替换2(tan和sec)

    tan和sec常用公式 我一直认为三角函数中只有sin和cos是友好的,其它都是变态.现在不得不接触一些变态: 这些变态的相关等式: 等式的证明 这个稍有点麻烦,先要做一些前置工作. 三角替换 示例1 ...

  6. java的关键字:static、final

    java的 static: 性质 静态对象 非静态对象 拥有属性: 是类共同拥有的 是类各对象独立拥有的 内存分配: 内存空间上是固定的 空间在各个附属类里面分配 分配顺序: 先分配静态对象的空间 继 ...

  7. netty异步

    通俗理解:http://lingnanlu.github.io/2016/08/16/netty-asyc-callback 异步的小demo:https://blog.csdn.net/coder_ ...

  8. 解决webpack不是内部命令

    在指定路径下安装webpack npm install webpack --save-dev 但是报”不是内部命令错误" 解决方法:安装全局webpack   npm install web ...

  9. Git Bash主题配置

    考虑到window的 Vim操作,发现Git Bash自带命令行很好用. Vim写作Markdown真的好用 还不是为了装逼 只是配色很不爽,就找了这个. 不要怕非常简单麻烦,需要2步骤 1- 打开g ...

  10. 学hadoop需要什么基础

    最近一段时间一直在接触关于hadoop方面的内容,从刚接触时的一片空白,到现在也能够说清楚一些问题.这中间到底经历过什么只怕也就是只有经过的人才会体会到吧.前几天看到有个人问“学hadoop需要什么基 ...