[转载]首窥Delphi XE2的浮点性能(翻译) | 您所在的位置:网站首页 › 全国中医类研究生院校有多少所 › [转载]首窥Delphi XE2的浮点性能(翻译) |
原文地址:First look at XE2 floating point performance 其中一代码已上传到百度网盘:MandelTest.zip
XE2现在已经正式发布,是时候来先看一下Delphi XE2编译器的浮点运算性能了(见前曲)。 这次的测试我会重用Mandelbrot基准测试,基于此代码:Mandelbrot集 in HTML 5 Canvas。它所测试的是在一个紧凑的循环中,双精度浮点数的基本操作(加、减、乘),有相对较少的内存访问(或许不应该有,为了测试更加准确)。
你可以在这里找到源代码,它可在XE2中马上直接编译(注释掉for Win64的汇编代码)。 注:在这篇文章最初发布时,我偶然发现XE2试用版中的一个"陷阱"(或特性?),它基本上禁用了在Project Options中定义的Win64平台的优化。松本健?指出了问题,这是我在代码中使用{$O+}编译指令”强制“优化后,发表的更新文章。我可以很高兴地说,其成果是一个*更*漂亮的图片!保留的最初文章已经用不上了,Embarcadero干得不错! 9月5日编辑,在进一步的测试后,我添加了一个看起来不那么热的单精度浮点测试。关于这个主题可以查看此处。 基准测试结果 来不宜迟,这里是在我机器上480 x 480用例的原始数据,记住Delphi版本没有使用Canvas.Pixels[],而是对数组进行直接的内存访问。 图1. 执行时间(毫秒),越低性能越好
或许你更喜欢确切的数字: Delphi XE2 - 32 bits: 193 ms Delphi XE2 - 64 bits: 67 ms -- 最快的Delphi Delphi XE: 196 ms FireFox 6: 121 ms Chrome 13: 74 ms (出于比较: XE 32bit 手工汇编: 57 ms) 这说明了什么? XE2 32bit 编译器仍然使用旧的FPU代码,XE的性能指数是最小的,可能仅仅是一个对齐问题(伪随机,因为编译器不主动对齐)。让我们期待SSE2代码生成器可以在XE3中得以改造。 XE2 64bit 编译器从使用SSE2中得到很好的加速,使它得以赶上和超过所有的JavaScript JIT们。 Chrome V8 在这次基准测试中有很好的表现,但未能卫冕, 本地Delphi夺首!
窥视真相 下面的两行代码,编译器生成了什么? x := x0 * x0 - y0 * y0 + p; y := 2 * x0 * y0 + q;
当你打开CPU View,你可以看到: FMandelTest.pas.193: x := x0 * x0 - y0 * y0 + p; 00000000005A1452 660F28C4 movapd xmm0,xmm4 00000000005A1456 F20F59C4 mulsd xmm0,xmm4 00000000005A145A 660F28CD movapd xmm1,xmm5 00000000005A145E F20F59CD mulsd xmm1,xmm5 00000000005A1462 F20F5CC1 subsd xmm0,xmm1 00000000005A1466 F20F58C2 addsd xmm0,xmm2 FMandelTest.pas.194: y := 2 * x0 * y0 + q; 00000000005A146A 660F28CC movapd xmm1,xmm4 00000000005A146E F20F590DA2000000 mulsd xmm1,qword ptr [rel $000000a2] 00000000005A1476 F20F59CD mulsd xmm1,xmm5 00000000005A147A F20F58CB addsd xmm1,xmm3
再接下来的代码,编译器使用了xmm8,因此它是真正意识到在x86-64中你所拥有的16个xmm寄存器,最后保存浮点值到寄存器中,有些32位编译器(包括XE和XE2)并不这么做。 为什么它会输给手工汇编版本?小事一桩: 即使它使用到9个xmm寄存器,它并没有使用第10个,留下一些内存访问 通过更细致的分配,它可以适合8个xmm寄存器的所有情况,这可减少不必要的通信量 它给寄存器清零使用了从内存的move,没有统一或传递常数。 不过这些大多是与旧FPU代码编译(其中,XE2-Win32仍受影响)中大量问题的一个挑剔比较。 结论 支持SSE2的XE2 64位编译器,包含领先一步的Delphi浮点性能。XE2 32位编译器仍然是老样子。 如果你正在做繁重的浮点数学计算,XE2 64位编译器是一个获得更好性能的简单手段。 希望在Delphi XE3的时候,他们可以改造SSE2代码生成器到32位编译器中,但在此之前,应先平息所有关于”we don't need no 64bit“的批评。好吧,如果你做任何重要的浮点数学,Delphi XE2 64位是必须的! |
CopyRight 2018-2019 实验室设备网 版权所有 |