Cython:prange重复不并行化

时间:2019-02-19 23:08:26

标签: macos gcc parallel-processing cython

我具有以下用于并行归约的简单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混淆那些叮当声的问题。

1 个答案:

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

代码已编译,并行性按预期工作。