▶ 按照书上的代码完成了 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. openLayers 4 canvas图例绘制,canvas循环添加图片,解决图片闪烁问题

    一.问题来源: 接触Openlayers 一段时间了,最近做了一个农业产业系统,项目中涉及到产业图例,最后考虑用canvas来绘制图例图像.当中带图片的图例移动时,图片会实现闪烁留白情况.闪烁是因为绘 ...

  2. Spring Data JPA Hibernate @QueryHints

    另一个实例: http://leobluewing.iteye.com/blog/2032396 : 本文内容来源:https://blog.csdn.net/gavinchen1985/articl ...

  3. 【vue】Mac上安装Node和NPM

    http://bubkoo.com/2017/01/08/quick-tip-multiple-versions-node-nvm/ 作为前端开发者,node和npm安装必不可少.然而有时会因为安装新 ...

  4. HDU 5372 Segment Game (树状数组)

    题意是指第i此插入操作,插入一条长度为i的线段,左端点在b[i],删除某一条线段,问每次插入操作时,被当前线段完全覆盖的线段的条数. 题解:对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端 ...

  5. RAW+ASM 的RAC 安装文档

    实验平台:Oracle 10gR2 RAC + RHEL 4.0 +VMWare GSX 3.2.0 安装步骤: 1.安装前准备及OS安装配置 2.安装Oracle 10gR2 clusterware ...

  6. js ==与===区别(非严格相等与严格相等)

    基本数据类型:number.string.boolean.undefined.null 高级数据类型:object 表格形式比较: 比较的类型 == === 基础类型 不同基础类型间比较," ...

  7. osql执行数据库查询命令并保存到txt文件

    osql -Usa -P123 -d AppBox -Q "select * from Menus where sortindex > 1000" -o e:\xxx.txt ...

  8. WPF中控制窗口显示位置的三种方式

    首先新建一个WPF工程,在主界面添加一个按钮,并给按钮添加点击事件button1_Click,然后新建一个用于测试弹出位置的窗口TestWindow.1.在屏幕中间显示,设置window.Window ...

  9. VS起始页不显示最近使用的项目解决方案

    前段时间换了一家公司,做ASP.NET开发,让我郁闷的是VS的起始页总是不显示最近使用项目,起先没在意,后来觉得越来越不方便了,然后本着内事不决问百度,外事不决问谷歌的态度,我就百了下~,结果还真遇到 ...

  10. System V 消息队列 实例

    前言: 消息队列是消息的链接表,存放在内核中,并由消息队列标识符标识.我们将称消息队列为 “队列”,其标识符为“队列I D”.msgget创建一个新队列或打开一个存在的队列; msgsnd向队列末端添 ...