ProgramingTip

LAPACK을 사용하여 Cython 기반 확장 배포

bestdevel 2020. 11. 12. 19:25
반응형

LAPACK을 사용하여 Cython 기반 확장 배포


Cython 확장을 포함하고 LAPACK(및 BLAS)을 (를 ) 사용하는 Python 모듈을 작성 중 입니다. 사용하여 열린 나도 오전 clapack거나 lapacke, 어떤 종류의 또는 f2c또는 f2py솔루션을 필요. 중요한 내가 전화 할 수있는 것입니다 lapackblas호출 할 오버 헤드없이 꽉 루프의 사이에 썬에서 루틴.

여기 에서 한 가지 예를 찾았 습니다 . 그러나 그 예는 SAGE에 따라 늘어서 있습니다. 사용자가 SAGE를 원하거나 필요로하지 않기 때문에 SAGE를 설치하지 않고 모듈을 사용할 수 있습니다. 내 같은 사용자는 numpy, scipy, pandas 및 scikit learn과 같은 패키지를 사용할 수 있습니다. 사용할 수있는 가장 좋은 조합은 무엇이며 필요한 정보 (numpy, scipy 등)를 사용할 수있는 최소 setup.py 파일은 어떻게 생겼습니까?

편집 : 여기에 내가 한 일이 있습니다. 그것은 내 맥북에서 작동하지만 그것이 얼마나 잘 작동하는지입니다. 확실히 더 나은 방법이 있습니다.

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
from Cython.Build import cythonize
from numpy.distutils.system_info import get_info

# TODO: This cannot be the right way
blas_include = get_info('blas_opt')['extra_compile_args'][1][2:]
includes = [blas_include,numpy.get_include()]

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = cythonize([Extension("cylapack", ["cylapack.pyx"],
                                       include_dirs = includes,
                                       libraries=['blas','lapack'])
                   ])
)

내 macbook에서 clapack.h헤더 파일이 cblas.h. 그런 다음 pyx 파일 에서이 작업을 수행 할 수 있습니다.

ctypedef np.int32_t integer

cdef extern from "cblas.h":
    double cblas_dnrm2(int N,double *X, int incX)
cdef extern from "clapack.h":
    integer dgelsy_(integer *m, integer *n, integer *nrhs, 
    double *a, integer *lda, double *b, integer *ldb, integer *
    jpvt, double *rcond, integer *rank, double *work, integer *
    lwork, integer *info)

SciPy의 Cython에 대해 BLAS 및 LAPACK 루틴에 대해 질문을 사용하고 있습니다. 단지 래퍼는 여기에 설명되어 있습니다.

Fortran 루틴에 전달하는 모든 배열이 전달되어야합니다. .pyx 파일에서 필요에 따라 필요한 함수를 가져 오기 할 수 있습니다. 예를 들면 :

from scipy.linalg.cython_blas cimport dnrm2 
from scipy.linalg.cython_lapack cimport dgelsy 

BLAS 및 LAPACK 루틴을 직접 호출하는 Cython 확장을 안정적으로 배포 할 수있는 좋은 후보라고 생각합니다.


코드가 SciPy 전체에 종속되지 않도록하려면 여기 SciPy linalg디렉토리 에서 이러한 래퍼 함수에 대한 관련 파일을 많이 찾을 수 있습니다 . 유용한 참조는 소스 및 헤더 파일을 나열하는 setup.py 행입니다 . Fortran 컴파일러가 필요합니다!

이론 단지 BLAS 및 LAPACK 사이 썬 래퍼를 컴파일하고 모듈과 독립적 인 확장으로 그들을 묶을 필요가 여기에 소스 파일을 분리 할 수 있어야한다.

에서 연습 이 매우 서투른하는 것입니다. linalg 하위 모듈의 빌드 프로세스에는 다른 플랫폼 (예 : 여기에서 ) 에서 컴파일을 지원하기 위해 몇 가지 Python 함수가 필요합니다 . 빌드는 또한 다른 C 및 Fortran 소스 파일 ( 여기 )에 의존하며 경로는 이러한 Python 함수에 하드 코딩됩니다.

SciPy가 다른 운영 체제와 아키텍처에서 제대로 컴파일되도록하기 위해 많은 작업이 수행되었습니다.

나는 그것이 가능하다고 확신하지만, 파일을 섞고 경로를 조정 한 후에도 SciPy의 나머지 부분과 독립적으로 linalg 하위 모듈의이 부분을 빌드하는 올바른 방법을 아직 찾지 못했습니다. 올바른 방법을 찾으면이 답변을 업데이트하겠습니다.

참고 URL : https://stackoverflow.com/questions/14864895/distributing-cython-based-extensions-using-lapack

반응형