У меня есть следующая простая функция 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 итерации цикла для каждого потока вместо распараллеливания итераций по каждому потоку.Любая идея, что происходит?
Я использую Python 3.7.1 и Cython 0.29.2 на MacOS Mojave 10.14.3.
ОБНОВЛЕНИЕ: Вот мой файл 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 отдельно и должен установить переменные окружения 'CC' и 'CXX' при использовании OSX, чтобы избежать проблемыOSX псевдонимы этих лязг.