本文最初是由Ampere Computing发表的。 本文介绍了如何有效地使用GNU编译器收集(GCC)选项来帮助优化Ampere处理器上的应用程序性能。
尝试优化应用程序时,必须衡量潜在优化是否改善性能至关重要。这包括编译器选项。使用高级编译器选项可能会导致更好的运行时性能,这可能是出于增加编译时间,更多调试困难以及通常会增加二进制尺寸的成本。为什么编译器选项影响性能超出了本文的范围,尽管简短的答案是代码生成,现代处理器体系结构以及它们如何相互作用非常复杂!另一个重要的一点是,由于计算机体系结构的变化和特定的微结构,不同的处理器可能会从不同的编译器选项中受益。优化的重复实验是绩效成功的关键。
>如何衡量应用程序的绩效来确定限制因素以及以前发表的文章中已经涵盖的优化策略。该论文是在基于安培的阿尔特拉(Ampere Altra)实例上运行时要回答的前10个问题,它描述了要收集的性能数据以了解整个系统的性能。优化Ampere Altra家族处理器的性能分析方法解释了如何使用数据驱动方法有效地优化。
>本文首先总结了最常见的GCC选项,并描述了这些选项如何影响应用程序。然后,讨论使用GCC选项转向目前的案例研究,以提高Ampere处理器的VP9视频编码软件和MySQL数据库的性能。有效地使用了类似的策略来优化安培处理器上运行的其他软件。GCC建议
GCC编译器提供了许多可以改善应用程序性能的选项。有关详细信息,请参见GCC网站。要生成利用Ampere处理器中可用的所有性能功能的代码,请使用GCC -MCPU选项。>使用GCC -MCPU选项,要么设置CPU模型,要么告诉GCC使用基于GCC在VIA -MCPU =本机上运行的机器的CPU模型。注释基于旧版X86的系统,GCC -MCPU是-Mtune的不弃用同义词,而GCC -MCPU在基于ARM的系统上得到了完全支持。有关详细信息,请参见ARM的编译器标志指南:-March,-mtune和-mcpu。
-MCPU = Ampere1:生成将在安培处理器上运行的代码。 Ampereone是从安培的下一代云本地处理器,将高性能处理器的家族扩展到新的行业领先的核心计数。请注意,这可以生成不会在Ampere Altra和Altra Max处理器上运行的代码。此选项最初在GCC版本12.1及更高版本中可用,然后回到GCC 10.5和GCC 11.3。
-MCPU = Neoverse-N1:生成将在Ampere Altra,Ampere Altra Max和Ampere AmpereOne上运行的代码。在支持将在安培安培中运行的代码使用此选项,但它可能不会利用所有可用的新绩效功能。请注意,需要GCC版本9.1或更高版本才能为Ampere Altra和Ampere Altra Max处理器启用CPU特定调谐。
-MCPU =本机:生成代码基于CPU GCC正在运行的CPU模型。注意,需要GCC版本9.1或更高版本以启用Ampere Altra和Ampere Altra Max处理器的CPU特定调谐。
使用-mcpu =本机的使用可能更易于使用,尽管如果在其他系统上使用可执行文件,共享库或对象文件,则可能存在潜在的问题。如果在安培安培处理器上完成构建,则该代码可能无法在安培的Altra或Altra Max处理器上运行,因为生成的代码可能包括AMPERE安培处理器支持的ARMV8.6指令。 如果在Ampere Altra或Altra Max处理器上完成构建,则GCC将不会利用安培安培处理器上可用的最新性能改进。当构建代码以利用任何体系结构的性能功能时,这是一个一般问题。
>下表列出了支持Ampere处理器-MCPU值的GCC版本。
>我们的建议是使用上述适当的值使用GCC -MCPU选项(-mcpu = ampere1,-mcpu = neoverse -n1或-mcpu =本机)和-O2来建立性能的基线,然后探索其他优化选项并衡量与基线相比,不同的选项是否提高了性能。
>常见GCC选项的摘要:
-MCPU,以启用处理器特定的调整和优化。 (有关详细信息,请参见上面的讨论“设置-MCPU选项”部分。)
>-OS可以优化以减少代码大小。
-O2被认为是标准的GCC优化选项,并且可以用作与其他GCC选项进行比较的基准。
-O3添加了其他优化,以生成更有效的循环代码,如果您的应用程序性能在循环中所花费的时间主导,则可以尝试使用。
配置文件指导优化(PGO):-frofile -fer -fofile -fofile -use。生成编译器将使用的配置文件数据有潜在地对优化做出更好的决策,例如内部,循环优化和默认分支。这被认为是高级优化,因为它需要更改构建系统,请参见下文。
>链接时间优化(LTO):-flto。启用链接时间优化,允许编译器在各个源文件上进行优化。这使得在其他编译器优化以及其他编译器优化和其他编译器优化方面可以将函数在源文件上进行串联。这也被认为是高级优化,可能需要更改构建系统。此选项增加了整体构建时间,这对于大型应用程序可能是戏剧性的。可以将LTO仅在绩效关键源文件上使用,以减少构建时间。
>
>默认的libvpx构建:
如何使用-mcpu =本机
优化libvpx构建$ git clone https://chromium.googlesource.com/webm/libvpx $ cd libvpx/ $ export CFLAGS="-mcpu=native -DNDEBUG -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wdeclaration-after-statement -Wdisabled-optimization -Wfloat-conversion -Wformat=2 -Wpointer-arith -Wtype-limits -Wcast-qual -Wvla -Wimplicit-function-declaration -Wmissing-declarations -Wmissing-prototypes -Wuninitialized -Wunused -Wextra -Wundef -Wframe-larger-than=52000 -std=gnu89" $ export CXXFLAGS="-mcpu=native -DNDEBUG -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wdisabled-optimization -Wextra-semi -Wfloat-conversion -Wformat=2 -Wpointer-arith -Wtype-limits -Wcast-qual -Wvla -Wmissing-declarations -Wuninitialized -Wunused -Wextra -Wno-psabi -Wc++14-extensions -Wc++17-extensions -Wc++20-extensions -std=gnu++11 -std=gnu++11" $ ./configure $ make verbose=1 $ ./vpxenc --codec=vp9 --profile=0 --height=1080 --width=1920 --fps=25/1 --limit=100 -o output.mkv /home/joneill/Videos/original_videos_Sports_1080P_Sports_1080P-0063.mkv --target-bitrate=2073600 --good --passes=1 --threads=1 –debug
使用Linux Perf的调查测量功能中CPU周期的数量,该函数花费了最多的时间包括函数VPX_Convolve8_Horiz_Neon和VPX_Convolve8_vert_neon。 LIBVPX GIT存储库表明,通过ARM优化了这些功能以使用ARMV8.6-A USDOT(混合符号点产物)指令,该指令由Ampere处理器支持。
对于VPX_Convolve8_vert_neon,
将CPU周期从2.46E 11减少到2.07e 11,以减少16%。总体而言,使用-mcpu =天然来启用DOT产品指令加速编码文件Original_videos_sports_sports_1080p_sports_sports_1080p -0063.mkv在AMPERE ALTRA处理器上通过改进应用程序浏览器来启用7%。下表显示了使用Perf Record和Perf Report实用程序收集的数据,以测量CPU周期和指令退休。
构建config
符号在代表工作负载上运行应用程序以生成配置文件数据。
>使用配置文件数据,gcc -fprofile -use。>使用PGO,GCC可以通过提供其他信息,例如测量分支,而不是采用并测量循环跳闸计数来更好地优化应用程序。 PGO是一种有用的优化,可以尝试查看其是否提高性能。 PGO可能有助于包括分支错误预测的应用程序的性能签名,可以使用Perf Utility读取CPU的性能监控单元(PMU)计数器BR_MIS_PRED_RETIED。大量的分支错误预测导致前端摊位的很高比例,可以通过Stall_frontend PMU计数器进行测量。具有高L2指令的申请缓存率也可能受益于PGO,可能与错误预测的分支机构有关。总而言之,很大一部分分支机构错误预测,CPU前端摊位和L2指令cache遗漏是绩效签名,PGO可以提高性能。
总结使用GCC PGO优化MySQL的方式:
Sysbench用于评估MySQL性能
使用MySQL MTR(MySQL-Test-run)测试套件>可预测的高性能,平台可扩展性和功率效率在行业中提供了前所未有的。我们邀请您了解有关开发人员工作的更多信息,并在developer.amperecomputing.com上找到最佳实践,并加入community.amperecomputing.com。
以上是Ampere处理器GCC指南的详细内容。更多信息请关注PHP中文网其他相关文章!