今天看到有人在一个硬体论坛问起CUDA的计算能力1.0,1.1,1.2和1.3版本的区别.
现在做个小小的解释.
首先说明,CUDA的硬体计算能力是不可以通过软体升级来升级的,就像DirectX的版本支持一样,但是同样也可以像DirectX一样通过软体模拟(EMU模式),不过性能暴降,而且准确性难以保证.
CUDA硬体的计算能力{zx0}正式发布的是1.0版本,是搭载G80 GPU面世的,目前{zx1}的是1.3版本.
其也不同于CUDA Tookit和SDK的软体版本,曾经看到一篇驱动之家的Fermi架构分析里面居然还分不清CUDA的软体和硬体计算能力版本是xx不一样的东西,真是贻笑大方了.
CUDA Tookit和SDK是给开发人员的软体,目前官方{zx1}版本是2.3,当然3.0版本的Beta早已面世.
让我们看看硬体计算能力版本的规格.
来自CUDA Programming Guide:
计算能力 1.0 的规范
每个块的{zd0}线程数为 512;
一个线程块的 x、y 和 z 维的{zd0}规格分别为 512、512 和 64;
线程块网格各维度的{zd0}规格为 65535;
n???????? Warp 块的大小是 32 个线程;
n???????? 每个多处理器的寄存器数量是 8192;
n???????? 每个多处理器可用的共享存储器数量是 16KB,组织为 16 个存储体;
n???????? 固定存储器的总量是 64KB;
n???????? 固定存储器的缓存工作区是每个多处理器 8KB;
n???????? 纹理存储器的缓存工作区介于每个多处理器 6 到 8KB 之间;
n???????? 每个多处理器的{zd0}活动块数是 8;
n???????? 每个多处理器的{zd0}活动 warp 块数是 24;
n???????? 每个多处理器的{zd0}活动线程数是 768;
n???????? 对于绑定到一维 CUDA 数组的纹理参考,{zd0}宽度为 213;
n???????? 对于绑定到二维 CUDA 数组的纹理参考,{zd0}宽度为 216,{zd0}高度为 215;
n???????? 对于绑定到三维 CUDA 数组的纹理参考,{zd0}宽度为 211,{zd0}高度为 211,{zd0}深度为 211;
n???????? 对于绑定到线性存储器的纹理参考,{zd0}宽度为 227;
n???????? 内核大小限制为 200 万 PTX 指令;
n???????? 每个多处理器都由 8 个处理器组成,因此一个多处理器能够在 4 个时钟周期内处理一个 warp 块的 32 个线程。
计算能力 1.1 的规范
n???????? 支持在全局存储器的 32 位字上操作的原子函数。
计算能力 1.2 的规范
支持在共享存储器中操作的原子函数以及在全局存储器的 64 位字上操作的原子函数;
n???????? 支持 warp vote 函数;
n???????? 每个多处理器的寄存器数量是 16384;
n???????? 每个多处理器的{zd0}活动 warp 块数量是 32;
n???????? 每个多处理器的{zd0}活动线程数是 1024。
计算能力 1.3 的规范
n???????? 支持双精度浮点数。
GPU不同,支持的硬体计算能力版本也不同,CUDA 1.0只有G80一种GPU支持,随后发布的G8x和G9x系列的GPU已经支持了CUDA 计算能力1.1.
目前只有GT200的GPU是支持到1.3的.
或许是因为支持double需要比较高的硬体成本,所以随后发布的廉价GPU GT21x系列只支持到CUDA 计算能力1.2.
当然这些都是向下兼容的.
CUDA此前对double支持不好一直是其在HPC领域大规模推广的硬伤之一,因为在金融,气象等等领域需要用到很高的精度,单精度显然是难以满足要求的.
于是就有了一些用单精度模拟双精度的算法出现,当然这是大幅损失性能的前提下实现的.
即使到了GT200能够支持double,但是double的运算性能仍然只有单精度1/7到1/8.
据说NVIDIA{zx1}的Fermi GPU能够大幅提高double运算性能,还是期待一下吧.