OpenACC 与 CUDA 的相互调用
▶ 按照书上的代码完成了 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 的相互调用的更多相关文章
- Android和JavaScript相互调用的方法
转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...
- 多个Activity相互调用和Intent
MainActivity.java和OtherActivity.java的相互调用 首先MainActivity.java是Android程序自带的,新建一个类OtherActiviy extends ...
- JS代码和OC代码的相互调用
JS调用OC 很多应用里面或多或少的调用了网页,来达到绚丽的效果,所谓的JS调用OC.....举个例子吧,网页上有个按钮 点击按钮跳转界面,跳转的动作由OC的代码实现. OC调用JS 还是举个例子,我 ...
- C程序与Lua脚本相互调用
Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows ...
- Unity3D中C#和js方法相互调用
通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...
- Unity3d 脚本相互调用
unity中三种调用其他脚本函数的方法 第一种,被调用脚本函数为static类型,调用时直接用 脚本名.函数名().很不实用…… 第二种,GameObject.Find("脚本所在物体名& ...
- Lua与C++相互调用
{--1.环境--} 为了快速入手,使用了小巧快速的vc++6.0编译器 以及在官网下载了Lua安装包..官网地址{--http://10.21.210.18/seeyon/index.jsp--} ...
- 关于action script与js相互调用的Security Error问题
大家都知道,as和js相互调用可以通过ExternalInterface.call和ExternalInterface.addCallback来进行. 比较好的做法是使用之前通过ExternalInt ...
- Java与.NET 的Web Services相互调用
一:简介 本文介绍了Java与.NET开发的Web Services相互调用的技术.本文包括两个部分,第一部分介绍了如何用.NET做客户端调用Java写的Web Services,第二部分介绍了如何用 ...
随机推荐
- 生成html报告并整合自动发动邮件功能
from HTMLTestRunner import HTMLTestRunnerfrom email.mime.text import MIMETextfrom email.header impor ...
- CTF-练习平台-Misc之 细心的大象
十五.细心的大象 打开图片属性 发现备注里有短信息,看着也不像flag,仔细观察里面只有只有大小写字母和数字应该是base64编码,解密后得到:MSDS456ASD123zz 好像也不是flag,题目 ...
- 相邻行列相互影响的状态类问题(类似状压dp的搜索)(POJ3279)
POJ3279http://poj.org/problem?id=3279 题意:黑白的板,每次选择一个十字形翻转(十字板内黑白互换,若是边界则不管),求最小将原图变为全白的策略. 这是一道对于每个格 ...
- 字符串匹配--扩展KMP模板
对于一个字符串 s 以及子串 t ,扩展KMP可以用来求 t 与 s 的每个子串的最长公共前缀 ext [ i ],当然,如果有某个 ext 值等于 t 串的长度 lent ,那么就说明从其对应的 i ...
- SQLite数据库学习小结——Frameworks层实现
3. SQLite的Frameworks层实现 3.1 Frameworks层架构 Android系统方便应用使用,在Frameworks层中封装了一套Content框架,之所以叫Content框架而 ...
- 命令行net time同步时间(内网)
首先还是推荐大家使用Internet时间来同步自己计算机的时间,这样做主要是方便,就是设置一个ntp服务器,我推荐下面的三个ntp服务器地址. time.asia.apple.com //亲测有效 a ...
- Spring 集成开发工具(STS)安装及配置
安装 spring 集成开发工具,下载地址:https://spring.io/tools 下载后,解压,双击 STS ,运行. 如果提示: 去oracle的网站上下载了1.8版本的jdk,下载地址如 ...
- jQuery如何取得HiddenField值(转)
<f:HiddenField runat="server" ID="cat_id" Text="ssss"/> var strD ...
- bzoj 2616 SPOJ PERIODNI——笛卡尔树+树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2616 把相同高度的连续一段合成一个位置(可能不需要?),用前缀和维护宽度. 然后每次找区间里 ...
- HttpFileCollection类
最近在学HttpRequest类搞文件上传的时候看到Request.Files返回了HttpFileCollection 这个类的一个对象,这个类用于获取浏览器上传的文件集合,在文件上传的时候可以通过 ...