Я хочу использовать внутри расширения Cython некоторые функции C, определенные в файлах .c, которые используют подпрограммы BLAS, например,
cfile.c
double ddot(int *N, double *DX, int *INCX, double *DY, int *INCY);
double call_ddot(double* a, double* b, int n){
int one = 1;
return ddot(&n, a, &one, b, &one);
}
(скажем, функции делают большечем просто вызвать одну подпрограмму BLAS)
pyfile.pyx
cimport numpy as np
import numpy as np
cdef extern from "cfile.c":
double call_ddot(double* a, double* b, int n)
def pyfun(np.ndarray[double, ndim=1] a):
return call_ddot(&a[0], &a[0], <int> a.shape[0])
setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
import numpy
setup(
name = "wrapped_cfun",
packages = ["wrapped_cfun"],
cmdclass = {'build_ext': build_ext},
ext_modules = [Extension("wrapped_cfun.cython_part", sources=["pyfile.pyx"], include_dirs=[numpy.get_include()])]
)
Я хочу, чтобы этот пакет связывался с той же библиотекой BLAS, котораяустановленный NumPy или SciPy используют и хотели бы, чтобы его можно было устанавливать из PIP в других операционных системах, используя в качестве зависимостей numpy или scipy, без каких-либо дополнительных зависимостей, связанных с BLAS.
Есть ли какой-нибудь хак для setup.py
что позволило бы мне сделать это так, чтобы он мог работать с любой реализацией BLAS?
Обновление: С помощью MKL я могу заставить его работать, изменив объект Extension
наукажите на libmkl_rt
, который можно извлечь из numpy, если установлен MKL, например: Extension("wrapped_cfun.cython_part", sources=["pyfile.pyx"], include_dirs=[numpy.get_include()], extra_link_args=["-L{path to python's lib dir}", "-l:libmkl_rt.{so, dll, dylib}"])
Однако этот же прием не работает для OpenBLAS (например, -l:libopenblasp-r0.2.20.so
).Указание на libblas.{so,dll,dylib}
не будет работать, если этот файл является ссылкой на libopenblas, но работает нормально, если это ссылка на libmkl_rt.
Обновление 2: Кажется, OpenBLAS называет свои функции C с помощьюзнак подчеркивания в конце, например, не ddot
, а ddot_
.Приведенный выше код с l:libopenblas
будет работать, если я изменю ddot
на ddot_
в файле .c.Мне все еще интересно, есть ли какой-нибудь (в идеале во время выполнения) механизм для определения того, какое имя следует использовать в файле c.