[译]08.打造灵活高效的粒子系统——工具的优化

07_4

本文我将测试几个编译器优化选项,打开这些设置可以让粒子系统运行的更快。下面就让我们看看怎样达到20%的效率提升的!

转载请注明[本文链接][原文链接],谢谢!

  • 开始

08_1

开始前统计下数据(Core i5 Sandy Bridge):

count tunnel attractors Fountain
151000 229.5 576.25 451.625
161000 465.813 727.906 541.453
171000 527.227 790.113 582.057
181000 563.028 835.014 617.507
191000 596.754 886.877 653.938

Core i5 Ivy Bridge:

count tunnel attractors fountain
151000 283.5 646.75 527.375
161000 555.688 812.344 629.172
171000 628.586 879.293 671.146
181000 670.073 932.537 710.768
191000 709.384 982.192 752.596

(时间是毫秒)

上面的数据是运行200次粒子系统的upate函数得到的,只是CPU的运算量。count是粒子的数量。你可以看下前一篇文章,了解基准方面的内容。

Visual Studio的设置如下:

  • Optimization: /02
  • Inline Function Expansion: Default
  • Favor Size or Speed: Neither
  • Whole program optimization: Yes
  • Enable enhanced instruction set: not set
  • Floating point model: /fp:precise(default)

当然我们只对提升运行结果感兴趣。我想确定VS编译器的什么设置有潜在的性能提升。

  • 浮点模式(Floating-point semantics mode)

默认情况下VS使用/fp:precise浮点模式。它不仅快而且又安全又精确。所有的计算都是在最高精度下做的。编译器只会在不影响最终结果的情况下,调整一些运算指令。

在粒子系统中,我们不需要这么高的精度。因为我们不是复杂的精确的物理仿真,所以可以牺牲一些精度换取性能。我们只使用浮点计算,一些微小的误差不会有什么影响。

使用fp:fast编译器将放宽一些限制,这样可以更多的代码优化。编译器通常会执行低一些的精度,这样我们也不会在建立80-bit精度上花费时间。(译者注:Intel x86浮点栈使用80位的扩展双精度表示,VS2012只支持64位,double和long double是一样的,GCC4.3支持long double 80位浮点精度。)另外,这个模式下即使会带来一些误差编译器也会调整一些运算指令,。

通过将浮点模式从 fp:precise改成fp:fast后,得到以下结果:

Core i5 Sandy Bridge

count tunnel attractors fountain
171000 497.953 700.477 535.738
181000 533.369 744.185 569.092
191000 565.046 787.023 601.512

Core i5 Ivy Bridge

count tunnel attractors fountain
171000 597.242 823.121 635.061
181000 635.53 872.765 675.883
191000 674.441 924.721 713.86

大约有5%甚至11%的性能提升。

  • 使用增强指令集

SIMD指令集已经出现相当长一段时间了,所以明智的做法是使用它们。根据wiki上的介绍:

  • SSE2出现在2001 Intel奔腾4和2003 AMD速龙64处理器上
  • SSE4出现在2006 Intel微处理器架构和AMD K10架构
  • AVX出现在2011 Intel Sandy Bridge和同年AMD Bulldozer架构

遗憾的是,在我的示例中加入/arch:SSE2结果没有任何改变。但是当使用/arch:avx时,有一点点提升。

Core i5 Sandy Bridge

count tunnel attractors fountain
171000 429.195 608.598 460.299
181000 460.649 647.825 490.412
191000 489.206 688.603 520.302

Core i5 Ivy Bridge

count tunnel attractors fountain
171000 529.188 746.594 570.297
181000 565.648 792.824 605.912
191000 593.956 832.478 640.739

在Sandy Bridge上大约有20%的性能提升,Ivy Bridge大约有15%的提升,当然/fp:fast是开启的。

另外,当我使用/arch:AVX2时,程序宕掉了。

  • 其他设置

我尝试了其他编译选项:启用函数级链接,优选大小或速度,全程序优化。很遗憾,几乎没有性能差异。

  • 缺少什么?

08_2

有没有试过自动向量化和自动并行化?也许有帮助呢?为啥不使用这两个强大的功能呢?实际上可以让编译器自动处理大部分情况,而不必手动去修改代码。

在VS中(VS2012及以后)有两个很重要的选项/Qvec和/Qpar。望文生义,这是自动使用向量指令和自动分配多核任务。

这两个选项我了解的不太深,在我的示例中它们没有起效,性能也没有提升。

了解“自动”选项干了什么事,你需要用/Qvec-report/Qpar-report这两个编译选项。这样的话编译器会输出哪个循环向量化了或者并行化了,或者在哪里有问题。 MSDN上有一篇文章详细介绍了可能阻止“自动”选项的问题。

当然,我需要仔细研究那些“自动”的强大功能,并找出如何正确地使用它们。

另外:自动向量化和使用增强指令集的区别是什么?

  • 额外的GCC (mingw)结果

08_3

尽管在不同的编译器上编译全功能的粒子Demo会有很多问题,但是编译“cpuTest”这个例子却没啥问题。这个只是简单的控制台程序,所以我用GCC(mingw版本)重新编译了,运行结果如下:

32bit, Ivy Bridge

GCC 4.8.1, -march=native -mavx -Ofast -m32 -std=c++11 -ffast-math

count tunnel attractors fountain
151000 230.000 508.000 415.000
161000 439.500 646.750 494.375
171000 493.688 694.344 531.672
181000 534.336 748.168 568.584
191000 565.792 798.396 613.198

64bit, Ivy Bridge

-march=native -mavx -Ofast -m64 -std=c++11 -ffast-math

count tunnel attractors fountain
151000 251.000 499.500 406.750
161000 459.875 622.438 473.719
171000 505.359 672.180 510.590
181000 539.795 714.397 546.199
191000 576.099 764.050 579.525

看起来GCC编译器比VS优化的更好(764.050ms vs 832.478ms)。

  • 总结和下一步

我测试了几个VS的编译选项,貌似只有浮点模式和使用增强指令集明显提高了性能。

Final results:最终结果:

CPU count tunnel attractors fountain
Sandy 191000 489.206 (-18.02%) 688.603 (-22.36%) 520.302 (-20.44%)
Ivy 191000 593.956 (-15.66%) 832.478 (-14.77%) 640.739 (-15.15%)

最终,大约有20%的速度提升(Sandy Bridge平台),15%的提升(Ivy Bridge平台)。没有一下提升很多,但已经很不错了。这只是点几下鼠标就完成的。

问题:你是否知道其他一些有用的VS/GCC的编译选项可以应用到本文所述情况的?

下一篇,我将介绍如何通过SIMD指令集进一步提升性能。只需要重写一部分关键代码就可以更好的利用CPU。

  • 需要帮助和测试?

做个实验,如果能在gcc和clang下编译并比较运行结果就更好了。或者使用不同的CPU测试,如果你能提供帮助,请在这个github地址下载代码,运行获得结果后请让我知道。

最简单的方式是直接下载exe文件(应该是无毒的,但也请扫描下)然后将运行结果保存下来。

原文地址:http://www.bfilipek.com/2014/09/flexible-particle-system-tools.html

No Responses

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

You must enable javascript to see captcha here!