最近一阵进行了一些OpenCL简单测试,得出了一些有趣的结论。由于AMD还没有公布RV870架构的官方文档,因此我们可以从这些结论中反推AMD/ATI显卡的架构,并对OpenCL未来的走向作一个简单的判断。
首先是峰值计算能力方面,我们进行了单精度浮点、双精度浮点和32bit整数计算测试,测试项目包括加法、乘法、乘加,以及浮点的特殊函数和定点的位操作测试。
测试结果表明:
GTX285的单精度乘加峰值计算能力为660GFLOPs,HD4890为800GFlops
乘法GTX285由于具有双发射达到了450Gflops,HD4890为400GFlops
加法GTX285为330GFlOPS,HD4890为400GFLOPS
超越函数方面,GTX285的原生(native)和普通精度较高版均以数倍优势胜出HD4890
5870在超越函数的比例上也没有得到改善,Fermi令人满意
双精度方面,GTX285乘加为约83GFLOPS,正好是单精度的1/8
加法为41GFLOPS
乘法为41Gflops,因为双精度没有双发机制
双精度测试AMD方面本来可以取得更大优势,但是驱动还没有提供支持
Fermi取得了很好的成绩
整数方面
GT200 加法330GFlops 乘法83Gflops 乘加135Gflops 测试的几项位操作120Gips
4870 在整数理论性能上略有优势(400Gflops),但是位操作大比分落后
Fermi拥有出色的32bit单元,因此整数乘法成绩将与加法相同
带宽测试包括Memcpy、GPU访问显存和local memory
Memcpy测试中,ATI的主机与设备端实用带宽仅达到了1.7GB/s,即使考虑到RV770拥有全双工的PCI-E控制器,这一成绩也是不能接受的
GT200的主机设备端通信速度相当正常,为5GB/s,Fermi有相当提高
4890使用的显存间memcpy机制匪夷所思,速度仅10GB/s,GT200为100GB/s
GT200实测显存带宽达到了100Gflops,而4890对float型数据仅20GB/s,对float4型打包数据读写才能获得更高性能
在对local memory(相当于CUDA的shared memory)进行32bit数据读写测试时,由于4890使用的是显存模拟local memory,因此只获得了20GB/s的速度,而GTX285为1TB/s,差距达到了50倍。
不过待AMD改善驱动后,带宽测试成绩将有所提高,但是由于硬件架构原因,应该还是只能对四向量打包型数据才能获得最高性能,而不打包数据的性能和随机访问的性能则低于Nvidia标量架构
5870的对global原子操作速度达到了GTX285的16倍,说明5870拥有与fermi类似的缓存,只是功能可能稍弱。
不过GTX285使用对shared memory原子后,也可以取得与5870相当的成绩
在SHA-1 AES matrixmul等测试中,4890取得的成绩相当于GTx285的9%-33%,而5870为GTX285的66%-200%
测试项目还在增加中,有待完善
由于下代GPU都拥有较强的cache机制,因此是否进行image测试还没有决定。
在实际应用中,ATI必须在每个线程内使用float4或者int4等四向量数据才能获得最高性能,这提高了AMD平台的编程难度,降低了在某些应用中的性能。尤其是上一代的RV770的架构并不是为了OpenCL设计的,性能下降非常严重。
ATI的做法相当于在细粒度线程并行之下再加入了指令级并行,这样就存在group-item-vector element三级并行,并行方式更加难以设计,写起kernel来更加痛苦,而且性能也会受到影响。OpenCL主机端代码和CUDA runtime API相比简直就是地狱,再让kernel更加复杂,那么就是要开发人员的命了。
好在5870运行标量型代码的比4870有很大提高,那么看来OpenCL在Nvidia G8x/G9x/Gt200,以及ATI 58xx上,代码还是可以做到通用的。