[转载]首窥Delphi XE2的浮点性能(翻译) 您所在的位置:网站首页 全国中医类研究生院校有多少所 [转载]首窥Delphi XE2的浮点性能(翻译)

[转载]首窥Delphi XE2的浮点性能(翻译)

#[转载]首窥Delphi XE2的浮点性能(翻译)| 来源: 网络整理| 查看: 265

原文地址: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 实验室设备网 版权所有