c - 动态链接器 (ld.so) 中的运行时 cpu 检测

标签 c linux optimization linker

我想将运行时 CPU 调度集成到我的库中。我有一些函数的几个版本,针对 sse2/sse3/avx 和 x87 通用变体进行了优化。我想将所有版本编译成一个 .so 库,我想如何实现 cpu 调度程序。

我认为最快的方法是在链接步骤(动态链接)进行 cpu 调度,因此当 ld.so 加载我的库时,我希望它检查 cpu 是否支持 sse2、sse3 或 avx,然后我希望 ld.so 选择正确的函数集。

例如(使用 gcc target attribute ):

图书馆:

float* func3_generic(float *a, float *b)  __attribute__ ((__target__ ("fpmath=387")));
float* func3_sse2(float *a, float *b)  __attribute__ ((__target__ ("sse2")));
float* func3_sse3(float *a, float *b)  __attribute__ ((__target__ ("sse3")));
float* func3_avx(float *a, float *b)  __attribute__ ((__target__ ("avx")));

我想要一些特殊的符号func3(),它会被链接器(ld.so)设置为最高级的func3_genericfunc3_sse2 func3_sse3func3_avx。所以,如果 cpu 是 Core i7-xxxx,我希望对 func3 的每次调用都是对 func3_avx 的调用,如果 cpu 是 PentiumPro,对 func3 的调用将是对 func3_generic 的调用。

与此同时,我不想手动编写大量调度代码,而且我希望以最少的开销选择正确的变体(没有额外的间接跳转)。这意味着我可以在应用程序启动时提供额外的时间,但在调用此函数时没有任何额外的时间(在某些情况下调用次数非常多)。

更新。链接器可以根据 AUXV vector 进行调度,AT_HWCAP: 字段:

$ LD_SHOW_AUXV=1 /bin/echo
...
AT_HWCAP:    fpu ... mmx fxsr sse sse2

最佳答案

... 使用 dlopen 简单地加载几个 .so 之一是否可以接受?您可以通过多种方法中的任何一种查询 CPU 类型,然后选择合适的库来绑定(bind) func3

关于c - 动态链接器 (ld.so) 中的运行时 cpu 检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403912/

相关文章:

c - "Array"功能正在阻止程序正常运行

linux - 在弄清楚如何使用 ioctl/SIOCGIFADDR/SIOCGIFCONF 在 Mac OS X 上获取以太网接口(interface)信息时遇到问题?

linux - 查找多个文件共有的行

python - 使用 Tensorflow 优化 python 中的函数

c - libmodbus 函数输出的部分输出打印

c - 如何修复我的代码以从函数返回指向结构的指针

postgresql - 数据库设计决策 : normalization or repetition?

c++ - 减少通用树遍历中的分支

c - 打印出目标表模式中的字符

python - 告诉 Python 将 .txt 文件保存到 Linux 上的某个目录