我想将运行时 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_generic
,func3_sse2
、func3_sse3
、func3_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/