加载中…
个人资料
红鱼儿
红鱼儿
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,318,260
  • 关注人气:241
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

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

(2019-10-31 17:40:09)
标签:

转载

原文地址:First look at XE2 floating point performance

其中一代码已上传到百度网盘:MandelTest.zip


XE2现在已经正式发布,是时候来先看一下Delphi XE2编译器的浮点运算性能了(见前曲)。

这次的测试我会重用Mandelbrot基准测试,基于此代码:Mandelbrot集 in HTML Canvas。它所测试的是在一个紧凑的循环中,双精度浮点数的基本操作(加、减、乘),有相对较少的内存访问(或许不应该有,为了测试更加准确)。


你可以在这里找到源代码,它可在XE2中马上直接编译(注释掉for Win64的汇编代码)。

注:在这篇文章最初发布时,我偶然发现XE2试用版中的一个"陷阱"(或特性?),它基本上禁用了在Project Options中定义的Win64平台的优化。松本健?指出了问题,这是我在代码中使用{$O+}编译指令”强制“优化后,发表的更新文章。我可以很高兴地说,其成果是一个*更*漂亮的图片!保留的最初文章已经用不上了,Embarcadero干得不错!

9月5日编辑,在进一步的测试后,我添加了一个看起来不那么热的单精度浮点测试。关于这个主题可以查看此处

基准测试结果

来不宜迟,这里是在我机器上480 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夺首!


窥视真相

下面的两行代码,编译器生成了什么?

:= x0 x0 y0 y0 p;

:= x0 y0 q;


当你打开CPU View,你可以看到:

FMandelTest.pas.193: := 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: := 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位是必须的!

0

  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有