我有一个 Python 扩展,它使用特定于 CPU 的功能(如果可用)。这是通过运行时检查完成的。如果硬件支持该POPCNT
指令,那么它会选择我的内部循环的一个实现,如果 SSSE3 可用,那么它会选择另一个,否则它会退回到我的性能关键内核的通用版本。(大约 95% 以上的时间都花在了这个内核上。)
不幸的是,有一个我没想到的失败模式。我使用-mssse3
and-O3
来编译所有的 C 代码,即使只有一个文件需要该-mssse3
选项。因此,其他文件的编译预期 SSSE3 将存在。这会导致该行出现段错误:
start_target_popcount = (int)(query_popcount * threshold);
因为编译器使用fisttpl
的是 SSSE3 指令。毕竟,我告诉它假设存在 SSSE3。
我的软件包的 Debian 打包器最近遇到了这个问题,因为测试机器有一个 GCC,它可以理解-mssse3
并生成代码,但机器本身有一个较旧的 CPU,没有这些指令。
我想要一个解决方案,其中相同的二进制文件可以在较旧的机器和较新的机器上运行,Debian 维护者可以将其用于该发行版。
理想情况下,我想说只有一个文件使用该-mssse3
选项编译。由于我的特定于 CPU 的选择器代码不是此文件的一部分,因此除非 CPU 支持,否则不会执行任何 SSSE3 代码。
但是,我想不出任何方法来判断distutils
一组编译器选项特定于单个文件。
这甚至可能吗?