我有我的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);
}
}
我的接口文件不包含任何%threads
或Py_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"