gpt4 book ai didi

python - 如何为一个 Python/C 扩展源文件指定不同的编译器标志?

转载 作者:太空狗 更新时间:2023-10-29 18:31:39 26 4
gpt4 key购买 nike

我有一个使用 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一组编译器选项特定于单个文件。
这可能吗?

最佳答案

一个非常丑陋的解决方案是创建两个(或更多 Extension)类,一个保存 SSSE3 代码,另一个保存其他所有内容。然后,您可以在 python 层中整理界面。

c_src = [f for f in my_files if f != 'ssse3_file.c']

c_gen = Extension('c_general', sources=c_src,
libraries=[], extra_compile_args=['-O3'])

c_ssse3 = Extension('c_ssse_three', sources=['ssse3_file.c'],
libraries=[], extra_compile_args=['-O3', '-mssse3'])

在某处的 __init__.py

from c_general import *
from c_ssse_three import *

当然你不需要我写出那段代码!而且我知道这不是 DRY,我期待阅读更好的答案!

关于python - 如何为一个 Python/C 扩展源文件指定不同的编译器标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15527611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com