我正在编写一个包含多个用Cython编写的模块的库,并使用openmp
模块大量使用并行性。该库可在任何平台上使用-Unix / Mac / Windows。
因此,我必须在模块定义中添加编译器标志,因此它是根据openmp
进行编译的。仅对于linux和mac,我做了这样的事情:
Extension('my.module', ['my/module.c'],
extra_compile_args=['-fopenmp', '-O3'],
extra_link_args=['-fopenmp', '-O3'],
),
但是,这在Windows上不起作用,因为msvcc的指令格式不同,即-fopenmp
替换为/openmp
,-O3
替换为/O3
。我当前的解决方案如下:
IS_WINDOWS = 'win' in sys.platform
openmp_opt = '/openmp' if IS_WINDOWS else '-fopenmp'
optim_opt = '/O3' if IS_WINDOWS else '-O3'
Extension('my.module', ['my/module.c'],
extra_compile_args=[openmp_opt, optim_opt],
extra_link_args=[openmp_opt, optim_opt],
),
此方法尽我所能进行测试。它有一个问题:msvcc
不需要extra_link_args
,而gcc
则需要。因此,在Windows上编译时,我收到链接器警告,指出/O3
和/openmp
被识别。
我的问题是:有没有更好的方法,内置在cython中,我还没有发现?是否有我错过的情况,即是否有其他我需要担心的编译器?窗户检查够好吗?