2014-09-23 94 views
2

我有我的C庫與swig接口。 我可以用我的setup.py編譯它。這裏的擴展部分:swig與openmp和python,swig -threads是否需要額外的GIL處理?

surf_int_lib = Extension("_surf_int_lib", 
        ["surf_int_lib.i", "surf_int_lib.c"], 
        include_dirs=[numpy_include], 
        extra_compile_args=["-fopenmp"], 
        extra_link_args=['-lgomp'], 
        swig_opts=['-threads'] 
        ) 

在我的庫中,我使用openmp進行並行化。當我打電話給我的例程時,我得到正確數量的線程,但它們都受GIL影響,並且同時運行。我的例程給了我正確的輸出。我感覺swig -threads在進入圖書館時會釋放GIL。那麼爲什麼我的函數不能並行化呢?

下面是一個OpenMP的程序的一個例子:

void gegenbauerval(double *x, int nx, double *cs, int ncs, double alpha, double *f, int nf) 
{ 
    int j; 

    #pragma omp parallel for default(shared) private(j) 
    for(j=0;j<nx;++j){ 
     f[j] = gegenbauerval_pt(x[j],cs,ncs, alpha); 
    } 
} 

我的接口文件不包含任何%threadsPy_BEGIN_ALLOW_THREADS電話。我需要釋放GIL嗎?如果是這樣,我該怎麼做?

更新: 我有numpy openblas安裝在virtualenv,我用我的計算。它與沒有virtualenv的python解釋器完全相同。 如果我使用激活的環境在線運行,它不是並行化的。但是,如果我使用標準安裝來運行它,它就可以工作。 所以我不再確定真正的錯誤是什麼。

python -c "import surf_int.lib.surf_int_lib as slib;import numpy as np;a=np.random.randn(1e8);c=np.random.rand(23);x=slib.gegenbauerval(a,c,1.5); print x" 

回答

0

經過進一步調查,我發現這是openmp和openblas之間的問題(至少是0.2.8版)。

重新編譯openblas 0.2.11與選項USE_OPENMP=1後,從numpy的兩個BLAS例程以及使用OpenMP我自己的擴展使用的所有CPU,環境變量設置OMP_NUM_THREADS的。

該問題可能與this bug report和或更改日誌條目openblas 0.2.9.rc2有關。