在nVidia论坛的一个帖子中,有人放出来了一个
GTX480的CUDA-Z测试结果图,通过分析该结果我们可以对fermi的CUDA性能有个大致的了解。
CUDA-Z是一个检测显卡CUDA性能的小软件,其功能大致相当于devicequery+bandwidthTest+一简单的benchmark。
CUDA-Z的benchmark原理是用1个block进行计算,然后乘上sm数得到整体的性能。它的kernel启动参数固定为<<<1,512>>>。具体测试内容是一个加乘组成的循环(因此不能利用dual-issue,实际上没有测到真正的峰值)。测试的数据类型包括单精度/双精度/24位整数/32位整数四种。
该贴给出的GTX480的CUDA-Z测试结果为:
内存拷贝带宽: 57.7GB/s
单精度: 1338.0Gflop/s
双精度: 168.2Gflop/s
32位整数: 671.8Giop/s
24位整数: 671.0Giop/s
作为对比, 我的GTX295的CUDA-Z测试结果为: (测试的是1个GPU,如果是整体性能要乘2)
内存拷贝带宽: 46.0GB/s
单精度: 593.0Gflop/s
双精度: 72.7Gflop/s
32位整数: 119.1Giop/s
24位整数: 593.3Giop/s
首先说明一下,CUDA-Z内存拷贝带宽值总是比bandwidthTest给出的要小,这是因为两者的标准不一样。CUDA-Z把内存读写算作一次,而bandwidthTest算作两次,因此bandwidthTest给出的结果一般是CUDA-Z的2倍。
这里GTX480内存带宽是GTX295的57.7/46.0=1.25倍,而GTX480的理论峰值带宽应该是GTX295的177.4/111.9=1.59倍,这个差别有点大,CUDA-Z没有把GTX480的带宽完全发挥出来。
单精度的结果,GTX480和GTX295都符合freq*cores*2的公式。因为没有利用到dual-issue,这是正常的。
双精度的结果,GTX480和GTX295都符合freq*cores*2/8的公式。只能说GTX480十分令人失望。
GTX295的32位整数很慢,只有单精度的1/5。因为测试的是整数乘法,慢是正常的,这不能完全代表GTX295的整数性能,如果是整数加减法会快很多。
GTX295的24位整数很快,为freq*cores*2,和单精度一样快。这说明要么存在整数的mad指令,要么触发了dual-issue。
GTX480的24位和32位整数测试结果相同,这和手册上的说明不符,可能有点问题,因为手册上说sm_20的24位乘法很慢。
还一点需要注意的是GTX480整数性能是freq*cores*1,而GTX295的24位整数是freq*cores*2。这个退步不小,某些情况下可能会成为一个问题。