2015-11-09 2 views
3

Я следующий Cython код:Параллелизм в Cython не работает

from cython import parallel 
from libc.stdio cimport printf 

def test_func(): 
    cdef int thread_id = -1 
    with nogil, parallel.parallel(num_threads=10): 
     thread_id = parallel.threadid() 
     printf("Thread ID: %d\n", thread_id) 

Тем не менее, всегда начинается только один поток, т.е. выход всегда только

Thread ID: 0 

Что я делаю неправильно получить многопоточность?

ответ

6

Cython использует OpenMP для его многопоточных возможностей.

Чтобы включить OpenMP, компилятору понадобится дополнительный флаг, который будет передан ему при компиляции и компоновке, иначе параллельная часть вашего кода будет проигнорирована.

Флаги для некоторых популярных компиляторов являются:

  • НКУ = -fopenmp
  • MSVC =/OpenMP
  • ИКК = -openmp

Предполагая, что вы сохранили функция в файле test.pyx: setup.py должен работать, если вы используете GCC.

from distutils.core import setup, Extension 
from Cython.Build import cythonize 

extensions = [Extension(
       "test", 
       sources=["test.pyx"], 
       extra_compile_args=["-fopenmp"], 
       extra_link_args=["-fopenmp"] 
      )] 

setup(
    ext_modules = cythonize(extensions) 
) 

После компиляции, как, что код должен порождать 10 потоков при запуске:

In [1]: import test 

In [2]: test.test_func() 
Thread ID: 9 
Thread ID: 1 
Thread ID: 6 
Thread ID: 7 
Thread ID: 3 
Thread ID: 8 
Thread ID: 5 
Thread ID: 4 
Thread ID: 0 
Thread ID: 2 

Если вы хотите еще немного информации, чем this страницы в Cython документации имеет хорошее базовое руководство о том, как использовать параллелизм с цитоном.

Смежные вопросы