我具有以下用于并行归约的简单Cython函数:
# cython: boundscheck = False
# cython: initializedcheck = False
# cython: wraparound = False
# cython: cdivision = True
# cython: language_level = 3
from cython.parallel import parallel, prange
cpdef double simple_reduction(int n, int num_threads):
cdef int i
cdef int sum = 0
for i in prange(n, nogil=True, num_threads=num_threads):
sum += 1
return sum
恐怖地返回以下内容:
In [3]: simple_reduction(n=10, num_threads=1)
Out[3]: 10.0
In [4]: simple_reduction(n=10, num_threads=2)
Out[4]: 20.0
In [5]: simple_reduction(n=10, num_threads=3)
Out[5]: 30.0
换句话说,它似乎在为每个线程重复循环的所有 n 个迭代,而不是并行化每个线程的迭代。知道发生了什么吗?
我在macOS Mojave 10.14.3上使用Python 3.7.1和Cython 0.29.2。
更新:这是我的setup.py文件:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize
import os
import sys
if sys.platform == 'darwin':
os.environ['CC'] = 'gcc-8'
os.environ['CXX'] = 'g++-8'
EXT_MODULES = [Extension('foo', ['foo.pyx'],
extra_compile_args=['-fopenmp'],
extra_link_args=['-fopenmp'])]
setup(name='foo',
ext_modules=cythonize(EXT_MODULES))
我已经单独安装了GCC,并且在使用OSX时必须设置环境变量'CC'和'CXX',以避免OSX混淆那些叮当声的问题。
答案 0 :(得分:0)
我通过首先使用Anaconda安装gcc来解决此错误:
conda install gcc
然后更改setup.py中的行以使用该新编译器:
if sys.platform == 'darwin':
os.environ['CC'] = '/anaconda3/bin/gcc'
os.environ['CXX'] = '/anaconda3/bin/g++'
使用Anaconda gcc(而不是我最初使用的冲煮安装)无法立即解决问题。由于以下错误,它无法编译:
/anaconda3/envs/python36/lib/gcc/x86_64-apple-darwin11.4.2/4.8.5/include-fixed/limits.h:168:61: 致命错误:limits.h:没有这样的文件或目录#include_next / *递归到真正的* /
这里的问题必须归因于macOS 10.14和XCode 10.0。但是,@ Maxxx在this related question中给出的解决方案对我有用。安装隐藏在命令行工具目录中的.pkg后
/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
代码已编译,并行性按预期工作。