使用openmp在Cython中调用Scipy的RectBivariateSpline评估函数

时间:2016-06-07 02:10:09

标签: scipy openmp cython

我真的想使用Cymp和openmp来运行scipy.interpolation.RectBivariateSpline.ev函数。样条曲线的评估函数现在是我要优化的代码中的最后一个瓶颈。

作为权宜之计,我正在使用Python的multiprocessing软件包来评估大型坐标数据的可承受性......但是,由于多种原因,我们需要远离{{1包裹。

我在将Fortran multiprocessing函数重构为C然后用Cython包装之前的最后一站是尝试使用openmp和Cython包装Scipy bisplev函数。

正如我所料(但希望不是这种情况),scipy.interpolate._fitpack._bisplev是一个Python对象而不是_bisplev d,并且不能在Cython中使用cdef调用。我看过但找不到nogil的来源,但我现在想象它是某种Fortran-C-Python接口。 (这对我来说是一个多余的声明,因为我不知道究竟是什么)。

如果有人对我可以从这里开始的地方有任何建议......特别是在不使用Python _bisplev的情况下并行化scipy.interpolation.RectBivariateSpline.ev调用的最佳方法,我将非常感激。任何其他提示或推动正确的方向也将非常感激。

我第一次尝试为multiprocessing制作(天真)Cython包装器,意图与openmp ::

并行化

interp2_fastev.pyx

bispev

我打算最终使用import numpy as np cimport numpy as np from scipy.interpolate._fitpack import _bispev def ev(double[:] x, double[:] y, double[:] ty, int kx, int ky, double[:] tx, double[:] c): cdef int ckx cdef int cky ckx = kx cky = ky with nogil: _bispev(tx, ty, c, kx, ky, x, y, 0, 0) 循环,但如果我甚至无法使用prange致电_bispev,那么这不是一个选项。

1 个答案:

答案 0 :(得分:1)

_fitpack是一个已编译的文件(.so):/scipy/interpolate/_fitpack.cpython-35m-i386-linux-gnu.so

github上搜索我找到了

scipy/scipy/interpolate/src/_fitpackmodule.c
scipy/scipy/interpolate/src/__fitpack.h

第二个有

的定义
static char doc_bispev[] = " [z,ier] = _bispev(tx,ty,c,kx,ky,x,y,nux,nuy)";
fitpack_bispev(PyObject *dummy, PyObject *args)

似乎负责内存分配并调用Fortran:

BISPEV(tx, &nx, ty, &ny, c, &kx, &ky, x, &mx, y, &my, z, wrk, &lwrk,
            iwrk, &kwrk, &ier);

使用fortran代码:

scipy/scipy/interpolate/src/fitpack.pyf