2015-11-09 24 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,編譯器需要在編譯和鏈接時將額外的標誌傳遞給它,否則將忽略代碼的並行部分。是

一些流行的編譯器的標誌如下:

  • GCC = -fopenmp
  • MSVC =/OpenMP的
  • ICC = -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 

如果你想在用Cython文檔比this頁一些更多的信息對如何使用並行良好的基本指南與cython。