0 环境
- Win7 32bit
- VS2013
- CUDA Toolkit 6.5
1 下载
最新版为CUDA Toolkit 7,下载之后发现该版本只支持64bit系统,我的系统是win7 32位的,于是选择了上一版本6.5,历史版本下载地址https://developer.nvidia.com/cuda-toolkit-archive
2 安装
只有一个安装文件,运行后首先会检查是否安装有支持cuda的NVIDIA显卡,然后自定义安装,我用不到3D相关的就都没选,默认路径太长,改了一下。CUDA Toolkit: “C:\NVIDIA\CUDA Toolkit”, CUDA Samples: “C:\NVIDIA\CUDA Samples”。然后下一步到安装完成。我同时装有VS2008与VS2013,但只有2013可以用,可能是cuda默认配置到高版本中吧。
3 测试
运行CUDA Samples\bin\win32\Release中的deviceQuery.exe程序查看是否安装成功以及显卡cuda信息。注意用命令行运行(可以直接拖动文件到命令行窗口中回车运行),否则结果一闪而过。该程序会输出CUDA Driver版本、CUDA计算能力、显存大小等信息,最后一行Result = PASS表示通过测试。
对于CUDA Toolkit 7,安装后Samples只有工程源码,没有可执行文件,需要自己编译一下相应工程生成deviceQuery.exe(Samples默认安装在ProgramData路径下,找了好久才找到)。
4 高亮
可能是我装的cuda与vs的版本都比较新吧,cu文件的语法高亮显示与函数自动提示并不需要任何配置。(如果是在非cuda runtime项目中,默认只有c++语法部分高亮,但添加cuda的附加依赖项(详细见后文6.3.3)后,全部均可高亮显示)
5 cuda工程
- 新建一个cuda runtime工程,会自动生成一个kernel.cu文件,实现两个向量相加
- 为了防止闪退,在
main()
函数最后加上getchar()
语句,或者使用system("pause")
,不过后者要加上头文件#include <stdlib.h>
- 如果运行出错可能是计算能力设置错误,项目属性 -> 配置属性 -> CUDA C/C++ -> Device -> Code Generation,默认为compute_20,sm_20,我的显卡为1.2则改为compute_12,sm_12
- 运行成功则输出{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55}
6 C++控制台工程/MFC工程中使用cuda
二者都是非cuda runtime的工程,配置方法完全一样,下面以控制台工程为例说明
- 新建控制台工程(VC++ -> 常规 -> 空项目)
- 添加cu文件(这里使用cuda runtime工程自动生成的模版文件,即将5中的kernel.cu拷贝到该工程路径下然后添加),可以新建一个筛选器专门存放cu文件,这样文件较多时看起来比较清楚
cuda配置
- 生成自定义,选中CUDA
- 计算能力设置,见5.3
-
附加依赖项设置,项目属性 -> 配置属性 -> 链接器 -> 输入 -> 附加依赖项,编辑加入cuda runtime工程中的对应内容,具体如下
cudart.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
kernel.cu文件属性“项类型”设为 CUDA C/C++
修改kernel.cu文件,只需要将
main()
函数改为普通函数,如addVec()
。相关代码片段如下// …… // 此处main函数改为addVec // int main() int addVec() { const int arraySize = 5; const int a[arraySize] = { 1, 2, 3, 4, 5 }; const int b[arraySize] = { 10, 20, 30, 40, 50 }; int c[arraySize] = { 0 }; // 中间代码省略…… if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaDeviceReset failed!"); return 1; } getchar(); return 0; } // ……
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
添加一个cpp文件,内容如下
extern int addVec(); int main(void) { addVec(); return 0; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 编译运行,应该可以输出{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55}了
本文原文链接 http://blog.youkuaiyun.com/yanglx2022/article/details/46446105