CUDA动态库封装以及调用

参考:http://blog.sina.com.cn/s/blog_618941f701016d26.html

通过将CUDA相关计算操作放在库中,方便在项目中调用,省去了每次编译cu文件的麻烦,也便于集成到其他平台上。

本文配置:VS2015   CUDA8.0

一、封装CUDA动态库

主要步骤:修改自定义方式、设置cu文件项类型为CDUA CC++ ,添加依赖库cudart.lib.

1、创建一个动态库,这里建的库是x86的,也可以更改为x64.

2、添加cu文件

3、源程序内容

CudaDll32.h

[cpp] view plaincopy
  1. // 下列 ifdef 块是创建使从 DLL 导出更简单的
  2. // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 CUDADLL32_EXPORTS
  3. // 符号编译的。在使用此 DLL 的
  4. // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
  5. // CUDADLL32_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
  6. // 符号视为是被导出的。
  7. #ifdef CUDADLL32_EXPORTS
  8. #define CUDADLL32_API __declspec(dllexport)
  9. #else
  10. #define CUDADLL32_API __declspec(dllimport)
  11. #endif
  12. extern "C" CUDADLL32_API int vectorAdd(int c[], int a[], int b[], int size);

kernel.cu

[cpp] view plaincopy
  1. #include "cuda_runtime.h"
  2. #include "device_launch_parameters.h"
  3. #include "CudaDll32.h"
  4. //CUDA核函数
  5. __global__ void addKernel(int *c, const int *a, const int *b)
  6. {
  7. int i = threadIdx.x;
  8. c[i] = a[i] + b[i];
  9. }
  10. //向量相加
  11. CUDADLL32_API int vectorAdd(int c[], int a[], int b[], int size)
  12. {
  13. int result = -1;
  14. int *dev_a = 0;
  15. int *dev_b = 0;
  16. int *dev_c = 0;
  17. cudaError_t cudaStatus;
  18. // 选择用于运行的GPU
  19. cudaStatus = cudaSetDevice(0);
  20. if (cudaStatus != cudaSuccess) {
  21. result = 1;
  22. goto Error;
  23. }
  24. // 在GPU中为变量dev_a、dev_b、dev_c分配内存空间.
  25. cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
  26. if (cudaStatus != cudaSuccess) {
  27. result = 2;
  28. goto Error;
  29. }
  30. cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
  31. if (cudaStatus != cudaSuccess) {
  32. result = 3;
  33. goto Error;
  34. }
  35. cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
  36. if (cudaStatus != cudaSuccess) {
  37. result = 4;
  38. goto Error;
  39. }
  40. // 从主机内存复制数据到GPU内存中.
  41. cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
  42. if (cudaStatus != cudaSuccess) {
  43. result = 5;
  44. goto Error;
  45. }
  46. cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
  47. if (cudaStatus != cudaSuccess) {
  48. result = 6;
  49. goto Error;
  50. }
  51. // 启动GPU内核函数
  52. addKernel << <1, size >> >(dev_c, dev_a, dev_b);
  53. // 采用cudaDeviceSynchronize等待GPU内核函数执行完成并且返回遇到的任何错误信息
  54. cudaStatus = cudaDeviceSynchronize();
  55. if (cudaStatus != cudaSuccess) {
  56. result = 7
  57. goto Error
  58. }
  59. // 从GPU内存中复制数据到主机内存中
  60. cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
  61. if (cudaStatus != cudaSuccess) {
  62. result = 8;
  63. goto Error;
  64. }
  65. result = 0;
  66. // 重置CUDA设备,在退出之前必须调用cudaDeviceReset
  67. cudaStatus = cudaDeviceReset();
  68. if (cudaStatus != cudaSuccess) {
  69. return 9;
  70. }
  71. Error:
  72. //释放设备中变量所占内存
  73. cudaFree(dev_c);
  74. cudaFree(dev_a);
  75. cudaFree(dev_b);
  76. return result;
  77. }

4、修改项目的自定义方式为:CUDA8.0

5、修改cu文件的项类型

6、添加链接器的附加依赖项 cudart.lib

7、生成DLL文件

二、调用动态库

创建一个控制台工程,调用库三步骤:

调用源代码:包含头文件、并把dll文件拷贝到可行性目录下

[cpp] view plaincopy
  1. // CallCudaDll32.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "CudaDll32.h"
  5. int main()
  6. {
  7. const int arraySize = 5;
  8. int a[arraySize] = { 11, 22, 33, 44, 55 };
  9. int b[arraySize] = { 10, 20, 30, 40, 50 };
  10. int c[arraySize] = { 0 };
  11. // Add vectors in parallel.
  12. int number = vectorAdd(c, a, b, arraySize);
  13. printf("{11,22,33,44,55} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",
  14. c[0], c[1], c[2], c[3], c[4]);
  15. printf("调用CUDA成功!\n");
  16. return 0;
  17. }

结果显示:

CUDA动态库封装以及调用相关推荐

  1. VC++动态库封装及调用

    https://blog.csdn.net/zhangfuliang123/article/details/71515796 一直对动态库的封装理解不是很透彻,虽然之前写过一个Demo,不过并没有真正 ...

  2. C++动态库封装及调用

    一直对动态库的封装理解不是很透彻,虽然之前写过一个Demo,不过并没有真正的理解.所以写下来,帮助自己理解下. 1.一个程序从源文件编译生成可执行文件的步骤: 预编译 -->  编译 --> ...

  3. Qt调用CUDA动态库及配置

    本文配置环境:Win7(x64)+VS2012+CUDA+Qt5.5.0 1.首先保证CUDA集成到VS下(如下图顺利安装Nsight for VS2012).CUDA安装比较简单,选自定义安装,然后 ...

  4. Linux 动态库的显示调用

    Linux 动态库的显示调用 分类: 动态库与静态库 2012-03-17 23:56 1710人阅读 评论(0) 收藏 举报 linuxnulllibrary测试web服务apache 10.动态库 ...

  5. Linux静态库和动态库创建与调用

    Linux静态库和动态库创建与调用 1. 静态函数库 2. 动态函数库 第1步:编辑得到举例的程序--hello.h.hello.c和main.c: 第2步:将hello.c编译成.o文件: gcc ...

  6. (成功案例超详细保姆级)vs2019 opencv qt创建动态库被C#调用

    之前有个项目关于图像处理,既用到了opencv,还二次开发了相机提供的动态库.一开始我是用QT写的,然后发现人家只需要我提供一个库函数调用就可以了,但是他是用C#写的.没办法,到处找资料,但是没有找到 ...

  7. 成功案例超详细-vs2019 opencv qt创建动态库被C#调用

    之前有个项目关于图像处理,既用到了opencv,还二次开发了相机提供的动态库.一开始我是用QT写的,然后发现人家只需要我提供一个库函数调用就可以了,但是他是用C#写的.没办法,到处找资料,但是没有找到 ...

  8. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  9. 【C 语言】动态库封装与设计 ( Windows 动态库简介 | Visual Studio 调用动态库 )

    文章目录 一.Windows 动态库简介 二.Visual Studio 调用动态库 一.Windows 动态库简介 在 C:\Windows\System32 目录中 , 存放着 Windows 中 ...

最新文章

  1. 波士顿动力的仓库机器人Strentch来了,挑战每小时搬运800个箱子
  2. 使用 ViS2005 进行单元测试
  3. Dapper 多数据库优化
  4. 02.1-元素定位(find)
  5. SpringCloud框架搭建+实际例子+讲解+系列五
  6. 倩女幽魂7月20日服务器维护,倩女幽魂手游7月20日更新什么?倩女幽魂手游7月20日更新一览...
  7. matplotlib的colorbar自定义刻度范围
  8. 第十一章:李淳风的秘谋
  9. 【iPhone资料】历代iPhone参数
  10. 详解电商订单逻辑流程图
  11. 百合佳缘伐谋、珍爱网伐交、伊对伐兵
  12. db2 前滚数据库_db2 前滚会话
  13. 四象限分析法分析你是否适合做管理
  14. 通信网与计算机网络的区别,计算机网络和计算机通信网络之间的本质区别是什么?...
  15. 网络爬虫八-处理user-agent
  16. 陕西师范大学计算机科学学院保研院校,陕西师范大学计算机科学学院(专业学位)计算机技术保研细则...
  17. ABAP资产负债表作业
  18. atv61/71变频器驱动板图纸施耐德变频器atv61驱动板图纸atv71
  19. Java经典面试:完美世界java开发待遇
  20. 大数据发展趋势如何?

热门文章

  1. xp计算机管理窗口,我的xp系统在“打开”窗口中没有“我的电脑”一项,只有界面、我的文档和界面,怎办?...
  2. 算法 - 堆排序(C#)
  3. java公共excel导入_Java实现Excel的导入功能
  4. oracle中asm磁盘不足,Oracle用户无法访问ASM磁盘组问题
  5. linux ntfs 挂载 centos,centos linux ntfs iso 挂载
  6. 查看mysql整个库的数据大小_查看mysql数据库容量大小
  7. dart 语言是jvm_Dart编译技术在服务端的探索和应用
  8. springcloud 微服务鉴权_我对微服务、SpringCloud、k8s、Istio的一些杂想
  9. 著名开源项目,神秘Bug影响超20000个项目,原因竟是作者删库跑路?
  10. 皮一皮:选第一个选项的人是咋想的?