OpenCL简测,AMD与NV平台对比

来源:互联网 发布:windows 域名解析 编辑:程序博客网 时间:2024/06/02 22:38

最近一阵进行了一些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上,代码还是可以做到通用的。