4、开发环境说明和配置
先决条件:
1、电脑具有支持cuda的GPU(一般具有独立显卡就可以,不过最好不要太老的版本);
2、英伟达显卡驱动;
3、标准C编译器;
4、CUDA开发工具包。
windows10下cuda工具包的安装:
1、MicroSoft Visio Studio 2017的安装(也可以是其他的版本,笔者使用的是2017)
2、下载cuda10.1安装包(最新的是10.2);
3、直接点击.exe文件进行安装,选择自定义安装,所有选项均勾选;
4、配置CUDA系统环境变量(和配置深度学习环境一样配置系统环境变量)。
5、开始第一个Hello CUDA程序
5.1、VS2017创建NVIDIA CUDA项目
步骤如下:
1)打开Microsoft Visual Studio。
2)进入File|New|Project。
3)依次选择NVIDIA|CUDA 10.1|CUDA 10.1 Runtime。
4)为项目自定义名称,然后单击OK按钮。
5)它将创建一个带有kernel.cu示例文件的项目。现在双击打开这个文件。
6)从文件中删除现有代码,写入前面编写的那段代码。
7)从生成(Build)选项卡中选择生成(build)进行编译,并按快捷键Ctrl+F5调试代码。
5.2、VS2017中输入 CUDA代码
#include <iostream> #include <stdio.h> __global__ void myfirstkernel(void) { } int main(void) { myfirstkernel << <1, 1 >> > (); printf("Hello, CUDA!\n"); return 0; }
与C编程的区别:
1)一个名为myfirstkernel的空函数,前缀为__global__
2)使用<<1,1>>>调用myfirstkernel函数
__global__是CUDA C在标准C中添加的一个限定符,它告诉编译器在这个限定符后面的函数定义应该在设备上而不是在主机上运行。在前面的代码中,myfirstkernel将运行在设备上而不是主机上,但是,在这段代码中,它是空的。
那么,main函数将在哪里运行?NVCC编译器将把这个函数提供给C编译器,因为它没有被global关键字修饰,因此main函数将在主机上运行。
代码中的第二个不同之处在于对空的myfirstkernel函数的调用带有一些尖括号和数值。这是一个CUDA C技巧:从主机代码调用设备代码。它被称为内核调用。内核调用的细节将在后面的章节中解释。尖括号内的值表示我们希望在运行时从主机传递给设备的参数。基本上,它表示块的数量和将在设备上并行运行的线程数。因此,在这段代码中,<<<1,1>>>表示myfirstkernel将运行在设备上的一个块和一个线程或块上。虽然这不是对设备资源的最佳使用,但是理解在主机上执行的代码和在设备上执行的代码之间的区别是一个很好的起点。
让我们再来重温和修改“Hello,CUDA!”代码,myfirstkernel函数将运行在一个只有一个块和一个线程或块的设备上。它将通过一个称为内核启动的方法从main函数内部的主机代码启动。
5.3、VS2017生成并开始执行