CUDA配置——cpp文件对cu文件的调用
Cuda极大程度的方便了我们利用GPU并行处理来加快自己程序的运行速度,但是大多情况下我们的程序是极为庞大的一个项目,只是利用cuda来加快其中某一块算法的运行效率,所以很多情况下是cpp文件来调用cu中的kernel函数。虽然cuda5.0之后可以直接从vs中生成现成的cuda项目,但是像这种通过cpp来调用cu文件的项目还是需要我们自己来进行配置的。
文件配置
因为我们要调用cu文件来进行加速,所以对于cu文件,需要把原来调用global设备函数的主函数main更改名字,如testghmain(); 之后在其前面加上extern “C” 。
在cpp文件中,对testghmain函数进行调用,所以需要对其事先进行声明。
extern “C” int testghmain();
之后便可以在需要的地方直接调用testghmain()了。
工程属性配置
此外,还需要对工程进行一些配置,右键工程->属性->附加依赖项,添加cudart.lib;
右键工程->生成自定义->选择cuda6.5;
右键添加的cu文件,属性->常规->项类型,选择cuda c/c++。
至此就全部配置完成,可以运行程序看看结果。测试程序是对数组a= { 1, 2, 3, 4, 5 };b= { 10, 20, 30, 40, 50 };相加得到c数组并计算c数组所有数据之和,正确结果应该返回165。
下面是在mfc中cpp文件来调用cu文件的项目结构组成,在其他类型的vs工程中调用cu也是如此,封装cu,添加extern “C”,更改项目属性配置。
Tips:
- kernel函数是需要进行封装才能添加extern “C”来进行声明并调用的,cpp文件中是不能直接调用 global 函数的,因为编译器是无法解析符号<<<……>>>以及blockIdx、threadIdx等,因此 global 函数只能放在.cu文件函数里面定义和调用。
- 用extern “C” 修饰的原因,就是.cu是扩展C,但只是部分只是cpp,所以需要定义为类C语言编译(NVCC.exe编译)。
- Cpp中是不能include“.cu”文件的,就好比cpp中不能include“.cpp”一样。