2

我的 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);
    }
}

我的接口文件不包括任何%threadsPy_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"
4

1 回答 1

0

经过进一步调查,我发现这是openmp和openblas(至少0.2.8版本)之间的问题。

使用 option 重新编译 openblas 0.2.11 后USE_OPENMP=1,来自 numpy 的 blas 例程以及我自己使用 openmp 的扩展都使用了由环境变量设置的所有 cpu OMP_NUM_THREADS

该问题可能与此错误报告openblas 0.2.9.rc2的更改日志条目有关。

于 2014-09-25T14:00:47.463 回答