基于龙芯2F的Glibc库优化
摘要:Glibc库是Linux系统最底层的函数库。本文分析了Glibc库的函数构成,在龙芯2F平台上对其中的字符串与内存的处理、数据转换、哈希表查找、以及加密函数的代码优化。实验结果表明,大部分函数的优化比率达到了30%以上,对龙芯2F平台的整体运行性能提升具有重要意义。
关键词:Glibc;龙芯2F;优化
0 引言
龙芯2F是中国科学院计算技术研究所研制的高性能通用处理器,具有低功耗、低成本以及自主安全的特点,已应用于高性能计算和日常生活领域。
龙芯2F以开源的Linux作为操作系统。Glibe库是Linux系统最底层的运行库,为其上的应用程序提供系统接口以及其它功能函数。此外,它还是以 C语言构建开发程序时使用的基本函数库。本文基于龙芯2F体系结构对Glibc库进行优化,对于提升龙芯2F的平台性能与用户体验有重要意义。
1 Glibc库介绍
Glibc库是GNU发布的C运行库,它封装了Linux操作系统提供的系统服务,除此之外,还提供了其它必要的功能服务实现。Glibc库是Li- nux系统最底层的函数库,是除了操作系统核心以外,所有应用程序赖以执行的基础环境。Linux系统上的其它函数库都需要直接或间接依赖于Glibc 库。
Glibc库包含两类函数,一种是与核心沟通的系统函数,它们封装了系统调用,对传入参数进行预处理之后就转到系统调用来完成功能,其目的是使得用户可以方便地使用操作系统核心提供的服务。系统调用接口与Linux操作系统相关,大部分流程固定,没有太大优化余地,对
其不做处理。
C库中的另一类函数提供常见的通用功能实现,包括标准输入输出控制,字符串处理,正则表达式,字符串加密,查找与排序等。它们提供基本的、与操作系统无关的功能,其中的部分函数有一定的计算量,是优化工作关注的部分。
Glibc库的版本在不断更新,本文以当前最新的Glibc2.11版本为基础进行优化。
2 龙芯2F体系结构
龙芯2F处理器实现了64位的MIPSⅢ指令集,整数寄存器和浮点寄存器均为64位,支持o32/n32和n64的ABI类型。除了 MIPS标准指令外,龙芯2F还提供了特有的整型计算和浮点计算指令。整型指令包括单条指令对3个寄存器进行操作的乘法、除法以及求模运算,浮点指令包括
乘加、开平方等运算。
龙芯2F包含两级Cache结构,L1 Cache数据和指令独立,均为64kB;L2 Cache数据和指令共享,为512kB。L1 cache和L2 cache都采用四路组相联结构,组内采用随机替换策略,cache行大小均为32字节。
3 Glibc库的优化
根据对Glibc库组成的分析,文章对其中的字符串与内存处理,数据转换,哈希表查找以及加密函数进行了优化,以下各节分别介绍其优化方法和优化效果。
3.1 字符串与内存处理函数
字符串与内存处理函数组提供了较为丰富的函数来完成各种操作,包括字符串与内存的移动、比较和查找等。两者的操作通常一一对应,因为C语言中的字符串即用一段连续的内存来表示,区别在于字符串用空字符NULL来表示结尾,而内存块的结尾由其大小确定。
对本组函数进行分析可知,部分函数之间的实现流程类似,如strlen和strnlen,memcpy和memccpy等。此外某些函数可通过调用其它函数来完成,如strcpy可由strlen与memcpy函数完成。
由于这一特点,字符串与内存处理函数组的优化方法可以相互借鉴,使用的优化方法主要包括以下几种:
优化访存指令。本组函数的处理流程一般是从一个或两个内存地址开始读取内存并进行相应的操作。在读取过程中考虑内存地址的对齐情况及读取单位,分别使用不同格式的访存指令。
分块处理。根据龙芯2F处理器的寄存器个数将待处理的字符串或内存分块,以充分利用寄存器进行循环展开。
汇编实现。本组函数包含了一些使用频繁且对系统性能影响较大的函数,如内存拷贝memcpy函数等,对此类函数我们使用汇编或内嵌汇编来实现,以避免编译器可能生成低效的代码。
表l是本组函数中主要函数的优化效果,以字符串规模或内存大小512B作为输入。
评论