Cython: Прандж повторяет, не распараллеливаясь - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть следующая простая функция 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 псевдонимы этих лязг.

1 Ответ

0 голосов
/ 21 февраля 2019

Я исправил эту ошибку, сначала установив gcc с помощью Anaconda:

conda install gcc

Затем изменив строки в setup.py для использования этого нового компилятора:

if sys.platform == 'darwin':
    os.environ['CC'] = '/anaconda3/bin/gcc'
    os.environ['CXX'] = '/anaconda3/bin/g++'

Используя Anaconda gcc (вместо того, чтобы установить brew, который я использовал изначально), не сразу решил проблему.Он не скомпилируется из-за следующей ошибки:

/ anaconda3 / envs / python36 / lib / gcc / x86_64-apple-darwin11.4.2 / 4.8.5 / include-исправлено / limit.h: 168: 61: фатальная ошибка: limit.h: нет такого файла или каталога #include_next / * рекурсивно до реального * * /

Проблема здесь связана с macOS 10.14 и XCode 10.0,Однако решение, данное @Maxxx в этот связанный вопрос , сработало для меня.После установки .pkg, скрытого в каталоге инструментов командной строки

/ Library / Developer / CommandLineTools / Packages / macOS_SDK_headers_for_macOS_10.14.pkg

код скомпилирован и параллелизмработал как положено.

...