我的 C 库与 swig 接口。我可以用我的 setup.py 编译它。这里是扩展部分:
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,如果需要,我将如何做?
更新: 我在 virtualenv 中安装了带有 openblas 的 numpy,用于计算。它与没有 virtualenv 的 python 解释器完全相同。如果我在激活环境的情况下运行以下 onlineer,则它不会并行化。但是,如果我使用标准安装运行它,它就可以工作。所以我不再确定真正的错误是什么。
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"