C语言 端口 glibc 2.25 和测试内存功能



我正在研究glibc-2.25中的一些内存函数(memcpy,memset,memmove)和各种版本(sse4,ssse3,avx2,avx512)是否可以为Linux(glibc 2.12)中的服务器程序提供性能提升。
我的第一次尝试是下载一个 glibc-2.25 的焦油球,并按照 https://sourceware.org/glibc/wiki/Testing/Builds 这里的说明进行构建/测试。我手动注释掉了内核版本检查,一切顺利。然后,一个测试程序与新构建的 glibc 链接,其过程列在 glibc wiki 的"针对 glibc 构建树编译"一节中,并且"ldd test"表明它确实依赖于预期的库:

# $GLIBC is /data8/home/wentingli/temp/glibc/build
libm.so.6 => /data8/home/wentingli/temp/glibc/build/math/libm.so.6 (0x00007fe42f364000)
libc.so.6 => /data8/home/wentingli/temp/glibc/build/libc.so.6 (0x00007fe42efc4000)
/data8/home/wentingli/temp/glibc/build/elf/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fe42f787000)
libdl.so.2 => /data8/home/wentingli/temp/glibc/build/dlfcn/libdl.so.2 (0x00007fe42edc0000)
libpthread.so.0 => /data8/home/wentingli/temp/glibc/build/nptl/libpthread.so.0 (0x00007fe42eba2000)

我使用 gdb 来验证实际调用了哪个 memset/memcpy,但它总是显示使用了__memset_sse2_unaligned_erms,而我期望可以使用该函数的一些更高级版本(avx2,avx512)。 我的问题是:

  1. glibc-2.25 是否根据 cpu/os/内存地址自动选择了最合适的内存功能版本?如果没有,我在 glibc 构建过程中是否缺少任何配置或我的设置有问题?
  2. 从较新的 glibc 移植内存函数还有其他选择吗?

任何帮助或建议将不胜感激。

在 x86 上,glibc 将自动选择最适合系统CPU的实现,通常基于英特尔的指导。 (这是否是你的方案的最佳选择可能尚不清楚,因为许多矢量指令的性能权衡非常复杂。 仅当您在工具链中显式禁用 IFUNC 时,这才会发生,但__memset_sse2_unaligned_erms不是默认实现,因此这不适用于此处。 ERMS 功能是最新的,因此这并非完全不合理。

构建一个新的 glibc 可能是测试这些字符串函数的正确方法。 理论上,你也可以使用LD_PRELOAD来覆盖 glibc 提供的函数,但是在 glibc 构建系统之外构建字符串函数有点麻烦。

如果你想在未安装后者的情况下针对修补的 glibc 运行程序,则需要在 glibc build 目录中使用testrun.sh脚本(或类似的方法)。

最新更新