EN
通过Freedom Platform调优Dhrystone性能

2020.05.28

对于使用低端处理器的用户来说,Dhrystone基准测试是一个有参考价值的评估性能工具。由于Dhrystone基准测试的性质,高端应用程序处理器性能不能完全用Dhrystone分数来表示。对于处理器提供商来说,Dhrystone分数是在早期评估中用于指令吞吐量比较的常用指标。

只有发布了测试环境,才能公平地比较Dhrystone的分数。为此,SiFive为其标准核心提供了两个Dhrsystone分值,分别是Legal分值和Best Effort分值。Legal分值是在Dhrystone编译模型和测量“基本规则”中规定的Dhrystone基准条件下获得的。

在本文中,我将向您展示SiFive如何通过使用编译器技术获得“Best Effort”分数。

 “Best Effort”分数的获得

以SiFive E31标准内核(单发射顺序RV32IMAC内核)为例,演示如何显著提高Dhrystone分数。下表是分数的汇总。正如预期的那样,E31内核由于其单发射架构而达到了1 IPC的峰值性能。但是,Dhrystone分数因不同的编译器选项集和特定库的调优而不同。通过使用带有自定义strcmp指令的激进编译器选项集(aggressive compiler option set),Dhrystone分数提高了73%(从1.61到2.78)。

Dhrystone分数和指令数

Dhrystone分数通常用DMIPS/MHz表示,公式如下:

如果每次Dhrystone循环花费较少的周期,则Dhrystone得分会更高。这可以通过改善微架构来减少周期数(例如,分支预测,负载延迟,缓存命中率),最终最小周期数将受到指令数的限制。

我们假设有一个保持峰值性能(IPC=1)的单发射(N个周期等于N条指令)内核,目的是为了通过指令数来评估最佳得分。下表给出了IPC-1机器的指令数号和分数之间的关系。当编译器使用Legal选项进行编译时,每次循环的结果是338条指令。这要求达到338个周期的峰值性能,即1.68 DMIPS/MHz;也就是一台单发射内核所能达到的最高的指令数——338条。

使用Legal选项运行Dhrystone基准测试,SiFive E31内核将获得1.61 DMIPS/Mhz的分数,这是最高分数的96%。因此,SiFive E31内核的峰值性能可提供的IPC = 0.958。

函数内联(Function Inline)和链接时间(Link Time)编译器优化

函数内联和链接时间优化(LTO)可以减少执行Dhrystone基准工作负载所需的指令数量。

下表显示了3个编译器选项下的动态指令数:

Ground rule

Ground rule + inline

Ground rule + inline + LTO

通过函数的内联合并,可以减少21%的指令数,从而减少分支数。随着链接时间优化(LTO)的应用,指令数可以再减少19%。总的来说,仅通过应用编译器优化就减少了36%的指令。

Dhrystone循环中的指令数减少直接提高了分数,而不需要更改处理器的微架构。在下面的图表中,我们标记了inline和inline + LTO的节点。假设IPC恒定(0.958),该分数理论上可能增加56%(1.68到2.63 DMIPS/Mhz)。在IPC = 0.958时,SiFive E31的得分增加了57%,从1.61增加到2.53。

特定微架构基准测试的更改

Dhrystone基准测试主要依赖于标准的C库函数。通过分析先前的优化结果,我确定strcmp()在三个编译器选项集中占总指令的16%、21%和26%,如下图所示。

在上述情况下,与处理器微架构相比,Dhrystone分数受strcmp()函数实现的影响更大,因为高达26%的代码是单个函数调用的。

为了进一步提高Dhrystone的分数,可以创建一个用于提高strcmp()性能的自定义指令来替换strcmp()函数,通过RISC-V newlib strcmp的实现,有效地消除了在每次Dhrystone循环周期中大约20条的指令。如下图所示,这可以将三个选项的得分分别提高7%、8%和10%。对于SiFive E31核心(IPC=0.958),这分别将分数提高到1.70、2.11和2.78。

SiFive不包含strcmp的硬件实现,因为它不太可能使许多嵌入式处理器应用程序受益。然而,在一些工作负载中,基于定制指令的性能改进是值得的。SiFive Core Designer可以帮助您了解基于需要配置内核的可用选项,包括添加SiFive自定义指令扩展SCIE。

轻松重现SiFive“Best Effort”分数

SiFive的Freedom E SDK包括Dhrystone基准测试,以及在执行makefile时通过设置DHRY_选项参数对本文中概述的3个编译器进行预设优化:

Ground rule

Ground rule + inline (DHRY_OPTION=fast)

Ground rule + inline + LTO (DHRY_OPTION=best)

总结

了解了Dhrystone的性能之后,您现在可以看到编译器选项和微架构更改对分数的影响。当比较制造商提供的分数时,了解测试环境是很重要的,只有这样,编译器的优化才不会与微架构的优势相混淆。

本文源自SiFive Blog,作者:Fu-Ching Yang,首席工程师,SiFive。经翻译后进行转载,其目的在于传递更多信息,版权归原作者所有。

原文链接:

https://www.sifive.com/blog/dhrystone-performance-tuning-on-the-freedom-platform

热门新闻