VS将CUDA文件打包成动态链接库
环境配置:VS2017 CUDA9.1
一、封装CUDA文件
1.创建一个动态链接库,选择x64
2.添加cuda文件(1个.cu文件,1个.h文件)
添加.cu文件
添加.h文件
3.在文件中粘贴被封装的代码
demo.cu文件中(此处注意,一定要添加头文件“demoh.h”)
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "demoh.h"`
`//CUDA核函数
__global__ void addKernel(int *c, const int *a, const int *b)`
`{`
`int i = threadIdx.x;`
`c[i] = a[i] + b[i];`
`}`
`//向量相加
int vectorAdd(int c[], int a[], int b[], int size)`
`{`
`int *dev_a = 0;`
`int *dev_b = 0;`
`int *dev_c = 0;`
```
// 在GPU中为变量dev_a、dev_b、dev_c分配内存空间.
cudaMalloc((void**)&dev_c, size * sizeof(int));
cudaMalloc((void**)&dev_a, size * sizeof(int));
cudaMalloc((void**)&dev_b, size * sizeof(int));
```
```
// 从主机内存复制数据到GPU内存中.
cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
// 启动GPU内核函数
addKernel << <1, size >> > (dev_c, dev_a, dev_b);
// 采用cudaDeviceSynchronize等待GPU内核函数执行完成并且返回遇到的任何错误信息
cudaDeviceSynchronize();
// 从GPU内存中复制数据到主机内存中
cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
//释放设备中变量所占内存
cudaFree(dev_c);
cudaFree(dev_a);
cudaFree(dev_b);
return 0;
```
`}
demoh.h文件中
#pragma once
extern "C" __declspec(dllexport) int vectorAdd(int c[], int a[], int b[], int size);
4.配置编译环境
修改项目自定义方式为:CUDA9.1
添加链接器的附加依赖项 cudart.lib(项目属性中)
5.生成.dll和.lib
在工程路径下的Debug目录中找到这两个文件
如果目录下只有.dll没有.lib文件的话在工程中添加.def文件再生成
二、调用动态链接库
所需文件:DEMO.dll、DEMO.lib、demoh.h,将以上三个文件拷贝到调用动态链接库的工程目录里
1.VS中新建cuda工程
2.添加头文件demoh.h
3.将.lib添加到链接器附加依赖项
4.在.cpp文件中调用封装的函数
`#include <iostream>`
`#include "demoh.h"`
`#include "stdio.h"`
`int main()`
`{`
`const int arraySize = 5;`
`int a[arraySize] = { 1, 2, 3, 4, 5 };`
`int b[arraySize] = { 10, 20, 30, 40, 50 };`
`int c[arraySize] = { 0 };`
```
// Add vectors in parallel.
vectorAdd(c, a, b, arraySize);
printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",
c[0], c[1], c[2], c[3], c[4]);
printf("调用CUDA成功!\n");
return 0;
```
`}`
三、在QT文件中调用动态链接库
待补充…