我正在尝试使用prange在cython中并行化for循环。我的设置文件非常基本:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize('my_cython_code.pyx'))
所以我使用-fopenmp作为cython编译器标志,我通过让my_cython_code模块的前两行完成:
# distutils: extra_compile_args = -fopenmp
# distutils: extra_link_args = -fopenmp
但是,我的机器在OSX上运行,而mac gcc编译器本质上是Clang,它不支持OpenMP。这意味着当我尝试构建我的并行化cython扩展模块时,我得到一个致命的编译器错误:
ld: library not found for -lgomp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'gcc' failed with exit status 1
有解决这个问题的方法吗?在构建扩展时,如何使用接受OpenMP的其他编译器?是否有其他方法可以让我使用标准mac架构将cython for循环并行化?
答案 0 :(得分:1)
正如您所说,您使用的是不支持OpenMP的编译器。你需要使用一个。如果您想使用支持OpenMP的正确GCC,请查看如何使用Macports或Homebrew安装GCC。
其他解决方案包括:
为Mac OSX安装(显然是商业的)英特尔编译器,支持OpenMP。
从源代码构建Clang-LLVM-OpenMP分支。这是一项非常重要的工作,我不建议新手使用。
所有这些都假设你是正确的,Cython使用OpenMP进行并行化。我不使用Cython,因此不知道如何实现prange。
答案 1 :(得分:0)
显然,Apple在某个时候放弃了对OpenMP的支持,因此,您不能使用标准gcc编译包含此依赖项的代码。解决该问题的一个好方法是安装LLVM并对其进行编译。这是对我有用的顺序:
安装LLVM:
brew install llvm
在setup.py中包含OpenMP标志(-fopenmp -lomp)。 -lomp标志由于某种原因未在任何地方进行描述,但对于正确的编译而言很重要:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize, build_ext
exts = [Extension(name='name_your_module',
sources=['your_module.pyx'],
extra_compile_args=['-fopenmp'],
extra_link_args=['-lomp']
)]
setup(name = 'name_your_module',
ext_modules=cythonize(exts,
cmdclass={'build_ext': build_ext})
然后使用LLVM编译代码:
CC=/usr/local/opt/llvm/bin/clang++ python setup.py build_ext --inplace
这应该导致并行化.so