Skip to content

Latest commit

 

History

History
63 lines (43 loc) · 2.46 KB

README.md

File metadata and controls

63 lines (43 loc) · 2.46 KB

微架构特定优化

短期目标

使用 Multilib 为特定芯片提供优化的二进制库

因为RISC-V指令集的快速变化,openEuler当前只提供RV64GC版的系统, 但是这会造成支持更新指令集的芯片无法发挥全部性能。

结果该问题有多种方案,其中一种为Multilib,即除了提供RV64GC基本 系统之外,也为一些基础库提供使用其他扩展指令集编译的版本。

以libc为例,glibc包为默认RV64GC版的库,将其libc.so.6安装到 /usr/lib64 下。

另外提供 glibc-rva23, 使用RVA Profile 23指令集标准进行编译, 其libc.so.6安装至/usr/lib64/rva23。

通过修改动态链接器,使其可以自动检测当前CPU的指令集状况(如 读取cpuinfo),来自动使用更优化的库。

出了libc外,我们亦可以为其他对性能影响较大的基础库提供优化版本。

使用 iFunc 来在同一个共享库中为同一函数提供多个版本

该功能依赖较新的GCC和GLIBC,将该目标设定为 openEuler 26.03 的目标。 当前openEuler 24.03 中的GCC版本为12,GLIBC版本为2.38.

我们需要随时监控GCC/GLIBC在该方面的进展。

中期目标

分析同样的二进制程序在不同的RISC-V CPU上表现出来的性能差异, 以帮助编译器为特定微架构输出更优化的代码。 同时可以帮助微架构设计者为更常用的指令序列进行特定优化。

一个例子: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115500

正向统计分析

分析重要的基础库、应用程序、编程语言运行时等,统计出常用的指令序列。 为这些指令序列编写性能测试代码,在不同的CPU上运行,比较性能差异, 分析原因。

逆向寻找

在不同的CPU上运行同样的二进制程序,分析哪些函数有较大的性能差异, 进一步分析,找出产生性能差异的指令序列。

指令序列的应用

  1. 指导编译器,乃至为GCC/LLVM提交相关优化补丁。
  2. 集合成册,指导微架构设计

长期目标

TBD

对实习生的要求

  1. 熟悉至少一种脚本语言(Python,Perl,Ruby,Shell等等)
  2. 初步了解编译器、C库之间的关系;初步了解动态链接、静态链接的概念
  3. 初步了解ELF文件格式

参考书目:《程序员的自我修养--链接、装载与库》 《Computer Systems: A Programmer's Perspective/深入理解计算机系统(CSAPP)》 《The GNU C Library Reference Manual》