如何在distutils中为一个Python/C扩展文件指定不同的编译器标志?

2024-09-27 21:24:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python扩展,它使用CPU特有的特性, 如果有的话。这是通过运行时检查完成的。如果 硬件支持POPCNT指令,然后选择一条 实现我的内部循环,如果SSSE3可用,那么 它选择另一个,否则它将返回到通用版本 我的性能关键内核。(大约95%以上的时间是 花在这个内核中。)

不幸的是,有一种我没想到的失败模式。我 使用-mssse3和-O3编译所有的C代码,即使 只有一个文件需要-mssse3选项。在

因此,其他文件的编译符合预期 SSSE3将会存在。这会导致线路出现段故障

start_target_popcount = (int)(query_popcount * threshold);

因为编译器使用了fisttpl,这是一条SSSE-3指令。 毕竟,我告诉它假设ssse3存在。在

我的包的Debian打包程序最近遇到了这个问题, 因为测试机器有一个gcc,它可以理解-mssse3和 生成代码时要考虑到这一点,但是机器本身有一个 旧的CPU没有这些指令。在

我想要一个同样的二进制文件可以在旧机器上运行的解决方案 在较新的版本中,Debian维护人员可以将其用于该发行版。在

理想情况下,我想说只有一个文件被编译 使用-mssse3选项。因为我的CPU专用选择器代码 不是此文件的一部分,将不会执行任何SSSE-3代码 除非CPU支持。在

但是,我想不出任何方法来告诉distutils 一组编译器选项特定于单个文件。在

有可能吗?在


Tags: 文件代码版本机器编译器选项指令特性
2条回答

一个非常难看的解决方案是创建两个(或多个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'])

在某处

^{pr2}$

你当然不需要我写代码!我知道这不枯燥,我期待着读到更好的答案!在

已经5年了,但我找到了一个比我的“CC”包装更喜欢的解决方案。在

“build_ext”命令创建一个自编译程序实例。这个编译器.编译()方法获取要编译的所有源文件的列表。基类执行一些设置,然后为具体的编译器子类提供一个compiler.\u compile()钩子,以实现实际的逐文件编译步骤。在

我觉得这是足够稳定的,我可以拦截代码在那一点。在

我从distutils.command.build\u扩展.build_ext哪一个调整自编译程序.\u编译以使用附加到实例的一次性函数包装绑定类方法:

class build_ext_subclass(build_ext):
    def build_extensions(self):

        original__compile = self.compiler._compile
        def new__compile(obj, src, ext, cc_args, extra_postargs, pp_opts):
            if src != "src/popcount_SSSE3.c":
                extra_postargs = [s for s in extra_postargs if s != "-mssse3"]
            return original__compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
        self.compiler._compile = new__compile
        try:
            build_ext.build_extensions(self)
        finally:
            del self.compiler._compile

然后我告诉setup()使用这个命令类:

^{pr2}$

相关问题 更多 >

    热门问题