《基于CUDA的并行程序设计》学习笔记(三)——上

《基于CUDA的并行程序设计》学习笔记(三)——上


第3章 CUDA编程基础

3.1 CUDA并行新思维

CUDA并行编程新思维的出现,不仅成功地利用了新一代GPU的硬件架构优势,同时克服了GPGPU(general purpose computing GPU)编程的缺点,为程序员定义了一个最小的C语言扩展包,这使得熟悉标准编程语言(如 C、FORTRAN 等语言)的程序员可以轻松掌握CUDA编程方法。

名为CUDA C的C语言拓展包包含3个主要的抽象概念:
(1) 线程组的层次结构;
(2) 共享存储器;
(3) 栅栏同步。
这些抽象概念提供了在粗粒度数据并行和任务并行中进行细粒度数据并行计算,提高了线程的并行度。

每一个粗粒度并行问题可以被划分为能够被多个块内线程独立并行处理的粗粒度子问题,而这每一个粗粒度子问题又可以被分割为同步并行协作处理的线程任务。每一个块都可以被调度到任意一个处理器核心,以任意的顺序并行或串行执行,这使得已编译好的CUDA程序能够在任意核心的GPU上执行,如下图所示,这些特性实现了CUDA并行编程模型的自动可扩展性。

《基于CUDA的并行程序设计》学习笔记(三)——上

3.2 CUDA的安装与配置

本节主要介绍CUDA在Windows中的配置。

3.2.1 系统需求

(1) 兼容CUDA的GPU硬件。
(2) GPU设备的驱动程序。
(3) Windows 7及以上。
(4) Microsoft Visual Studio 2013及以上。
(5) CUDA软件,即我们常说的CUDA Toolkit。

下面两个表格展示了当前支持CUDA 9.0的操作系统及编译器。

表1. 支持CUDA 9.0 的操作系统

Operating System Native x86_64 Cross (x86_32 on x86_64)
Windows 10 YES YES
Windows 8.1 YES YES
Windows 7 YES YES
Windows Server 2016 YES NO
Windows Server 2012 R2 YES NO

表2. 支持CUDA 9.0 的编译器

Compiler IDE Native x86_64 Cross (x86_32 on x86_64)
Visual C++ 15.0 Visual Studio 2017 YES NO
Visual C++ 14.0 Visual Studio 2015 YES NO
Visual C++ 14.0 Visual Studio Community 2015 YES NO
Visual C++ 12.0 Visual Studio 2013 YES YES
Visual C++ 11.0 Visual Studio 2012 YES YES
Visual C++ 10.0 DEPRECATED Visual Studio 2010 YES YES

3.2.2 验证GPU是否支持CUDA

可以通过Windows的设备管理器查看显示适配器一项,你可以找到你的显卡的产商和型号。然后对照附录1查看你的GPU是否支持CUDA。

如何查看设备管理器?

(1) 打开命令提示符
(2) 运行下面的命令行:control /name Microsoft.DeviceManager

3.2.3 下载并安装CUDA软件

CUDA软件可以在此页面(http://developer.nvidia.com/cuda-downloads)找到最新版本,然后根据平台类型下载。如果想安装历史版本,可以在此页面查找(https://developer.nvidia.com/cuda-toolkit-archive)。CUDA软件有两种安装格式:

  • Network安装
    安装了一个最小的安装程序,稍后下载安装所需的软件包。只有在安装程序的选择阶段中选择的包被下载。这个安装程序对于那些想要最小化下载时间的用户是很有用的。

  • Full安装
    一个包含CUDA工具包的所有组件的安装程序,不需要任何进一步的下载。这个安装程序对于缺乏网络访问和企业部署的系统非常有用。

CUDA工具包安装了CUDA驱动程序和用于创建、构建和运行CUDA应用程序的工具,以及库、头文件、CUDA示例源代码和其他资源。

3.2.4 安装CUDA软件

注意:必须为CUDA安装驱动程序和toolkit。如果您还没有安装一个独立的驱动程序,请从NVIDIA CUDA工具包安装驱动程序。

注意:如果安装开始后Windows更新开始,安装可能会失败。等到Windows更新完成后再重新安装。

这里我们将介绍的是本地安装,CUDA版本号为7.5。
(1) 双击下载好的CUDA Toolkit。
《基于CUDA的并行程序设计》学习笔记(三)——上

(2) 程序会自动检验CUDA和系统的兼容性,兼容的会出现这个画面,点击同意并继续
《基于CUDA的并行程序设计》学习笔记(三)——上

(3) 一般选则精简安装,点击下一步。
《基于CUDA的并行程序设计》学习笔记(三)——上

(4) 在安装的过程中程序会删除上一版本的一些驱动,再安装当前的版本。中间可能会弹出一些对话框,点击安装即可。
《基于CUDA的并行程序设计》学习笔记(三)——上

《基于CUDA的并行程序设计》学习笔记(三)——上

(5) 安装完后屏幕的分辨率可能会比较低,显示不正常。重启即可解决。

3.2.5 验证CUDA是否正确安装

(1) 首先验证nvcc是否安装成功。打开命令提示符,输入nvcc -V,输出版本号则nvcc安装成功。
《基于CUDA的并行程序设计》学习笔记(三)——上

(2) 导航至CUDA Samples的nbody目录,用你安装好的Visual Studio打开对应版本的nbody Visual Studio解决方法。如果找不到这个路径,就在查看里设置隐藏文件可见。
《基于CUDA的并行程序设计》学习笔记(三)——上

(3) 点击Build菜单中的Build Solution,重新生成工程。
《基于CUDA的并行程序设计》学习笔记(三)——上

(4) 导航至CUDA Samples的build目录,运行nbody样例。
《基于CUDA的并行程序设计》学习笔记(三)——上

《基于CUDA的并行程序设计》学习笔记(三)——上

如果能输出上图的结果,则CUDA已基本被正确安装,现在编译CUDA 7.5自带的samples。打开C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5目录下的Samples_vs2013.sln文件。在release模式下,重新生成解决方案。这时可能会出现下图的错误:
《基于CUDA的并行程序设计》学习笔记(三)——上

这时只需要从此处(https://www.microsoft.com/en-us/download/details.aspx?id=6812)下载DXSDK_Jun10.exe,按照默认安装即可。如果安装出现下列错误,检查是否存在C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include路径,如果存在则表明已安装了所需要的库。
《基于CUDA的并行程序设计》学习笔记(三)——上

安装完DXSDK_Jun10.exe,打开vs2013,重新生成工程。生成成功则输出如下结果。
《基于CUDA的并行程序设计》学习笔记(三)——上

打开命令提示符,跳转至C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\bin\win64\Release目录下面,输入deviceQuery.exe和bandwidthTest.exe。输出结果如下则CUDA已全部安装完毕,可以放心使用啦~
《基于CUDA的并行程序设计》学习笔记(三)——上

《基于CUDA的并行程序设计》学习笔记(三)——上

附录1

表3. GeForce桌面级产品

GPU Compute Capability
NVIDIA TITAN Xp 6.1
NVIDIA TITAN X 6.1
GeForce GTX 1080 Ti 6.1
GeForce GTX 1080 6.1
GeForce GTX 1070 6.1
GeForce GTX 1060 6.1
GeForce GTX 1050 6.1
GeForce GTX TITAN X 5.2
GeForce GTX TITAN Z 3.5
GeForce GTX TITAN Black 3.5
GeForce GTX TITAN 3.5
GeForce GTX 980 Ti 5.2
GeForce GTX 980 5.2
GeForce GTX 970 5.2
GeForce GTX 960 5.2
GeForce GTX 950 5.2
GeForce GTX 780 Ti 3.5
GeForce GTX 780 3.5
GeForce GTX 770 3.0
GeForce GTX 760 3.0
GeForce GTX 750 Ti 3.0
GeForce GTX 750 3.0
GeForce GTX 690 3.0
GeForce GTX 680 3.0
GeForce GTX 670 3.0
GeForce GTX 660 Ti 3.0
GeForce GTX 660 3.0
GeForce GTX 650 Ti BOOST 3.0
GeForce GTX 650 Ti 3.0
GeForce GTX 650 3.0
GeForce GTX 560 Ti 2.1
GeForce GTX 550 Ti 2.1
GeForce GTX 460 2.1
GeForce GTX 450 2.1
GeForce GTX 450* 2.1
GeForce GTX 590 2.0
GeForce GTX 580 2.0
GeForce GTX 570 2.0
GeForce GTX 480 2.0
GeForce GTX 470 2.0
GeForce GTX 465 2.0
GeForce GT 740 3.0
GeForce GT 730 3.5
GeForce GT 730 DDR3,128bit 2.1
GeForce GT 720 3.5
GeForce GT 705* 3.5
GeForce GT 640 (GDDR5) 3.5
GeForce GT 640 (GDDR3) 2.1
GeForce GT 630 2.1
GeForce GT 620 2.1
GeForce GT 610 2.1
GeForce GT 520 2.1
GeForce GT 440 2.1
GeForce GT 440* 2.1
GeForce GT 430 2.1
GeForce GT 430* 2.1

表4. GeForce笔记本级产品

GPU Compute Capability
GeForce GTX 1080 6.1
GeForce GTX 1070 6.1
GeForce GTX 1060 6.1
GeForce GTX 980 5.2
GeForce GTX 980M 5.2
GeForce GTX 970M 5.2
GeForce GTX 965M 5.2
GeForce GTX 960M 5.0
GeForce GTX 950M 5.0
GeForce 940M 5.0
GeForce 930M 5.0
GeForce 920M 3.5
GeForce 910M 5.2
GeForce GTX 880M 3.0
GeForce GTX 870M 3.0
GeForce GTX 860M 3.0/5.0(**)
GeForce GTX 850M 5.0
GeForce 840M 5.0
GeForce 830M 5.0
GeForce 820M 2.1
GeForce 800M 2.1
GeForce GTX 780M 3.0
GeForce GTX 770M 3.0
GeForce GTX 765M 3.0
GeForce GTX 760M 3.0
GeForce GTX 680MX 3.0
GeForce GTX 680 3.0
GeForce GTX 675MX 3.0
GeForce GTX 675M 2.1
GeForce GTX 670MX 3.0
GeForce GTX 670M 2.1
GeForce GTX 660M 3.0
GeForce GT 750M 3.0
GeForce GT 650M 3.0
GeForce GT 745M 3.0
GeForce GT 645M 3.0
GeForce GT 740M 3.0
GeForce GT 730M 3.0
GeForce GT 640M 3.0
GeForce GT 640M LE 3.0
GeForce GT 735M 3.0
GeForce GT 635M 2.1
GeForce GT 730M 3.0
GeForce GT 630M 2.1
GeForce GT 625M 2.1
GeForce GT 720M 2.1
GeForce GT 620M 2.1
GeForce 710M 2.1
GeForce 705M 2.1
GeForce 610M 2.1
GeForce GTX 580M 2.1
GeForce GTX 570M 2.1
GeForce GTX 560M 2.1
GeForce GT 555M 2.1
GeForce GT 550M 2.1
GeForce GT 540M 2.1
GeForce GT 525M 2.1
GeForce GT 520MX 2.1
GeForce GT 520M 2.1
GeForce GTX 485M 2.1
GeForce GTX 470M 2.1
GeForce GTX 460M 2.1
GeForce GT 445M 2.1
GeForce GT 435M 2.1
GeForce GT 420M 2.1
GeForce GT 415M 2.1
GeForce GTX 480M 2.0
GeForce 710M 2.1
GeForce 410M 2.1