2017-03-24 13 views
2

我正在调查glibc-2.25中的几个内存函数(sse4,ssse3,avx2,avx512)是否可以为我们的服务器程序提供性能增益(memcpy,memset,memmove) Linux(glibc 2.12)。
我的第一次尝试是下载一个glibc-2.25焦油球并按照这里的说明https://sourceware.org/glibc/wiki/Testing/Builds建立/测试。我手动评论了内核版本检查,一切进展顺利。然后,测试程序与在节中列出的程序新建glibc连接“编译的是glibc编译树”的glibc wiki和“LDD测试”中表明,它确实依赖于预期的库:端口glibc 2.25和测试内存函数

# $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)的一些更高级版本可能是in use。 我的问题是:

  1. glibc-2.25是否根据cpu/os/memory地址自动选择最合适的内存版本?如果没有,我在glibc编译期间是否缺少任何配置或设置有问题?
  2. 是否有任何其他替代方案从新的glibc移植内存功能?

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

回答

0

在x86上,glibc通常会根据Intel的指导自动选择最适合系统CPU的实现。 (这是否是您的场景的最佳选择可能不明确,因为许多向量指令的性能权衡是非常复杂的。)只有在明确禁用工具链中的IFUNC时,才会发生这种情况,但__memset_sse2_unaligned_erms isn' t默认实现,所以这不适用于此。 ERMS功能很新,所以这不是完全不合理的。

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

如果您想要在不安装补丁的glibc的情况下运行程序,则需要在glibc生成目录(或类似方法)中使用testrun.sh脚本。

+0

[glibc wiki](https://sourceware.org/glibc/wiki/Testing/Builds)提供了一些方法来测试新的glibc,但这似乎有点复杂,不适合生产环境。通常我们会遵循glibc作为资金核心系统组件不应该被替换的建议。单独构建这些字符串函数(特别是缓存/ cpu检测)真的很麻烦 – WindLeeWT

+0

非常感谢您的回复。在我看来,在LD_PRELOAD中使用新的glibc会使程序不稳定并且崩溃不可预测,对吗? – WindLeeWT

+0

您需要使用显式动态链接器调用来针对卸载的glibc运行程序,就像build目录中的'testrun.sh'脚本一样。 –