9.2_计算功能集
9.2 计算功能集
到目前为止,我们介绍的是所有支持CUDA的GPU的通用功能。例如,所有支持CUDA架构的GPU都可以启动核函数,访问全局内存,以及读取常量内存和纹理内存。但正如不同架构的CPU有着不同的功能和指令集(例如MMX、SSE、SSE2等),对于支持CUDA的不同图形处理器来说同样如此。NVIDIA将GPU支持的各种功能统称为计算功能集(Compute Capability)。
9.2.1 NVIDIA GPU的计算功能集
到本书截稿时间为止,NVIDIA GPU可以支持计算功能集包括1.0、1.1、1.2、1.3以及2.0。高版本计算功能集是低版本计算功能集的超集,类似于一种“洋葱式”或者“俄罗斯套娃玩具式”的嵌套结构(你可以选择自己喜欢的比喻)。例如,支持1.2版本计算功能集的GPU同样支持1.0版本和1.1版本的所有功能。在NVIDIA CUDA编程指南中包含了所有支持CUDA的GPU的最新列表,以及它们相应的计算功能集。表9.1列出了在截稿时所有可用的NVIDIA GPU,同时还列出了每个GPU支持的计算功能集。
表9.1 支持CUDA的GPU及其相应的计算功能集
当然,由于NVIDIA一直在发布新的图形处理器,因此在本书出版时,这张列表肯定会过时。幸运的是,NVIDIA公布了一个网络站点,在这个站点的CUDA Zone中给出了支持CUDA的最新设备列表。如果你没有在表9.1中找到你使用的GPU,那么我建议你参考这个列表,或者也可以运行第3章的示例程序将系统中每个CUDA设备的计算功能集显示出来。
由于本章的内容是关于原子性的,因此与这部分内容相关的就是硬件在内存上执行原子操作的能力。在了解原子操作是什么以及为什么要使用原子操作之前,你需要知道,只有1.1或者更高版本的GPU计算功能集才能支持全局内存上的原子操作。此外,只有1.2或者更高版本的GPU计算功能集才能支持共享内存上的原子操作。由于高版本计算功能集是低版本计算功能集的超集,因此计算功能集为1.2的GPU既支持共享内存原子操作又支持全局内存原子操作。同样,计算功能集为1.3的GPU也支持这两种原子操作。
如果你使用的GPU的计算功能集为1.0版本,那么它不支持全局内存上的原子操作,因此需要首先升级硬件设备。如果你的图形处理器支持原子操作,那么可以继续阅读下面的内容。但
如果你发现无法运行这些示例,那么可以直接跳到下一章。
9.2.2 基于最小计算功能集的编译
假设在编写的代码中要求计算功能集的版本最低不能低于某个版本。例如,假设你阅读完本章,并开始编写一个需要使用全局内存原子操作的应用程序。你知道要支持全局内存原子操作,计算功能集的最低版本为1.1。当编译代码时,你需要告诉编译器,如果硬件支持的计算功能集的版本低于1.1,那么将无法运行这个核函数。而且,当告诉编译器这个要求时,还可以指定一些只有在1.1或者更高版本的计算功能集中才支持的编译优化。要将这个信息告诉编译器,只需在调用nvcc时增加一个命令行选项:
nvcc -arch=sm_11同样的,在编译需要使用共享内存原子操作的核函数时,你要告诉编译器代码需要1.2版本或者更高的计算功能集。
nvcc -arch=sm_12