我正在调查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。 我的问题是:
- glibc-2.25是否根据cpu/os/memory地址自动选择最合适的内存版本?如果没有,我在glibc编译期间是否缺少任何配置或设置有问题?
- 是否有任何其他替代方案从新的glibc移植内存功能?
任何帮助或建议,将不胜感激。
[glibc wiki](https://sourceware.org/glibc/wiki/Testing/Builds)提供了一些方法来测试新的glibc,但这似乎有点复杂,不适合生产环境。通常我们会遵循glibc作为资金核心系统组件不应该被替换的建议。单独构建这些字符串函数(特别是缓存/ cpu检测)真的很麻烦 – WindLeeWT
非常感谢您的回复。在我看来,在LD_PRELOAD中使用新的glibc会使程序不稳定并且崩溃不可预测,对吗? – WindLeeWT
您需要使用显式动态链接器调用来针对卸载的glibc运行程序,就像build目录中的'testrun.sh'脚本一样。 –