NVIDIA多线程:CUDA-安装使用(配合VS2017)

安装

https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64,直接下载安装。装的时候安装选项全都装上就行。

兼容问题

使用的是 CUDA9.1 和 VS2017. 由于CUDA更新远远赶不上VS,所以……直接使用是不行的……

解决方案见https://blog.csdn.net/shenpibaipao/article/details/79519533,摘录于下:

  • 打开VS Installer,修改-单个组件,选上用于桌面的VC++2015.3 v140 工具集(x86, x64)
  • 项目属性里面换掉平台工具集
  • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\include\crt\host_config.h,修改第133行的#if _MSC_VER < 1600 || _MSC_VER > 1911,将1911改成一个比较大的数(如1920)
  • 因为v140里面没有安装CUDA,所以需要重新装一下CUDA

第一个项目

创建项目的时候选择模板-NVIDIA-CUDA,直接给示例程序,直接运行就行。(就只是向量相加,很快的)

代码分析:

  • 首先一堆include
  • addWithCuda函数用于main函数中调用,其中进行以下操作:
    • 定义显存中的指针dev_a,dev_b,dev_c,中间的函数调用全部会返回一个状态码,设置变量cudaStatus用于保存状态码
    • SetDevice
    • cudaMalloc函数来申请指针对应数组的空间
    • cudaMemcpy函数来向那三个指针里面拷贝内存中的数据
    • 调用计算用的函数,在显存里面计算
    • cudaGetLastError来检测有无错误
    • cudaDeviceSynchronize等待所有操作结束
    • cudaMemcpy来将结果数组拷贝回来
    • cudaFree释放空间

上面的程序也没有用多线程,也没啥复杂的操作,类似一个……代码比较长的helloworld

行数多主要是因为要考虑各种异常情况并且提示……自己写就懒得加了[doge]

程序设计

GPU配置查看

要多线程,肯定先看看多少个线程合适。代码里面直接添加(来自http://www.360doc.com/content/18/0408/16/5315_743836114.shtml):

1
2
3
4
5
6
7
8
9
int dev = 0;
cudaDeviceProp devProp;
cudaGetDeviceProperties(&devProp, dev);
std::cout << "使用GPU device " << dev << ": " << devProp.name << std::endl;
std::cout << "SM的数量:" << devProp.multiProcessorCount << std::endl;
std::cout << "每个线程块的共享内存大小:" << devProp.sharedMemPerBlock / 1024.0 << " KB" << std::endl;
std::cout << "每个线程块的最大线程数:" << devProp.maxThreadsPerBlock << std::endl;
std::cout << "每个EM的最大线程数:" << devProp.maxThreadsPerMultiProcessor << std::endl;
std::cout << "每个EM的最大线程束数:" << devProp.maxThreadsPerMultiProcessor / 32 << std::endl;

结果类似:

1
2
3
4
5
6
使用GPU device 0: GeForce GTX 950M
SM的数量:5
每个线程块的共享内存大小:48 KB
每个线程块的最大线程数:1024
每个EM的最大线程数:2048
每个EM的最大线程束数:64