【发布时间】:2013-03-09 18:53:44
【问题描述】:
我有一个使用 CPU 特定功能的 Python 扩展,
如果可供使用的话。这是通过运行时检查完成的。如果
硬件支持POPCNT 指令然后它选择一个
我的内部循环的实现,如果 SSSE3 可用,那么
它选择另一个,否则它会退回到通用版本
我的性能关键内核。 (大约 95% 以上的时间是
在这个内核中花费。)
不幸的是,出现了我没想到的故障模式。一世
使用 -mssse3 和 -O3 编译所有 C 代码,即使
只有一个文件需要-mssse3 选项。因此,其他文件的编译预期 SSSE3 将存在。这会导致该行出现段错误:
start_target_popcount = (int)(query_popcount * threshold);
因为编译器使用了fisttpl,这是一条SSSE3指令。
毕竟,我告诉它假设存在 SSSE3。
我的包的 Debian 打包器最近遇到了这个问题,
因为测试机有一个 GCC 可以理解-mssse3 和
考虑到这一点生成代码,但机器本身有一个
没有这些指令的旧 CPU。
我想要一个相同的二进制文件可以在旧机器上运行的解决方案 以及较新的版本,Debian 维护者可以将其用于该发行版。
理想情况下,我想说只编译一个文件
使用 -mssse3 选项。由于我的 CPU 特定选择器代码
不是此文件的一部分,不会执行任何 SSSE3 代码
除非 CPU 支持。
但是,我想不出任何办法告诉distutils
一组编译器选项特定于单个文件。
这可能吗?
【问题讨论】:
-
在考虑 danodonovan 的答案时,我意识到一个 hack 是有一个“CC”包装器,它为特定文件插入正确的标志。不优雅,但对 Debian 来说可能已经足够了。
-
我最近发现了一些合并 CMake 和 distutils 的快乐,使用 CMake 生成与扩展链接的静态库。你可以做类似的事情。在此处查看我们的 setup.py:github.com/CoolProp/CoolProp/blob/master/wrappers/Python/…
标签: python setup.py distutils compiler-flags