用Clang编译并行化的cython

时间:2015-01-18 14:28:39

标签: macos python-2.7 parallel-processing openmp cython

我正在尝试使用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循环并行化?

2 个答案:

答案 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