Cuda学习笔记——在vs中配置.cpp和.cu文件

时间:2024-03-13 10:47:29

Cuda-c极大程度的方便了我们利用GPU并行处理来加快自己程序的运行速度,但是大多情况下我们的程序是一个极为庞大的工程项目,在这个项目中我们只需要利用cuda来加快其中某一块算法的运行效率,所以很多情况下利用cpp文件来调用cu中的kernel函数,从而完成程序的并行运算。虽然cuda5.0之后可以直接从vs中生成现有的cuda项目,但是利用cpp来调用cu文件的项目还是需要我们自己来进行配置的。

一. 文件配置
  1. 首先假定我们已经写好了调用gpu运算的.cu文件,如下图所示。在这个文件中,我们首先定义调用global设备函数的主函数:

   testghmain();

    并在其前面加上extern “C” ,这个文件定义了a、b两个数组, 并利用gpu来实现c=a+b的运算。

   Cuda学习笔记——在vs2010中配置.cpp和.cu文件     

  2. 在我们的工程中,需要调用上面这个.cu文件中的函数进行并行加速的cpp文件中,对testghmain();函数进行调用,所以在文件前面需要对其进行事先声明。

  extern “C” int testghmain();

   Cuda学习笔记——在vs2010中配置.cpp和.cu文件          

  3. 之后,在上面这个.cpp文件中,需要的地方直接调用testghmain()。

     Cuda学习笔记——在vs2010中配置.cpp和.cu文件         
   

   在这里我们声明了一个MFC的控件响应函数OnBnClickedbutton来调用testghmain(),当用户点击这个button时,程序首先调用.cu文件中的testghmain函数,而testghmain函数会调用global设备函数,通过gpu实现c=a+b的运算,并把计算结果最终返回给用户。

二. 工程属性配置
  此外,在配置完文件之后,还需要对整个工程进行一些配置:
  1. 右键工程->属性->附加依赖项,添加cudart.lib;

Cuda学习笔记——在vs2010中配置.cpp和.cu文件

  2. 右键工程->生成自定义->选择cuda6.5;

    Cuda学习笔记——在vs2010中配置.cpp和.cu文件

  3. 右键添加的cu文件,属性->常规->项类型,选择cuda c/c++。

Cuda学习笔记——在vs2010中配置.cpp和.cu文件
  
  
  至此就全部配置完成,可以运行程序看看结果。测试程序是对数组a= { 1, 2, 3, 4, 5 };b= { 10, 20, 30, 40, 50 };相加得到c数组并计算c数组所有数据之和,正确结果应该返回165。

    Cuda学习笔记——在vs2010中配置.cpp和.cu文件     

  
  
  下面是在mfc中cpp文件来调用cu文件的项目结构组成,在其他类型的vs工程中调用.cu也是如此,封装cu文件,对主函数添加extern “C”,更改整个项目的属性配置。

    Cuda学习笔记——在vs2010中配置.cpp和.cu文件              

三. Tips:
  1. kernel函数是需要进行封装才能添加extern “C”来进行声明并调用的,cpp文件中是不能直接调用 __global__函数的,因为编译器是无法解析符号<<<……>>>以及blockIdx、threadIdx等,因此 __global__ 函数只能放在.cu文件函数里面定义和被调用。
  2. 用extern “C” 修饰的原因,就是.cu是扩展C,但由于cuda-c只是部分属于c++,所以需要更改工程的配置属性,将.cu文件定义为类C语言编译(NVCC.exe编译)。
  3. Cpp中是不能include“.cu”文件的,就好比cpp中不能include“.cpp”一样。

 

  • 酷侠一剑绝ggh2年前非常感谢楼主,解决了我的一个大问题,工程属性配置的第三步中我的Tool选项里面没有CUDA/C++选项,但我选择改成CUDA Runtime API 后,问题也得到了解决,我用的是CUDA6.0+VS2008.

转:https://blog.csdn.net/GH234505/article/details/51182490