68

LAPACKCython拡張機能と使用法(および)を含むPythonモジュールを作成していますBLASclapack必要に応じて、または、またはlapacke何らかのソリューションを使用することもできます。重要なのは、Python呼び出しのオーバーヘッドなしに、タイトなループでCythonからルーチンを呼び出すことができるということです。f2cf2pylapackblas

ここで1つの例を見つけました。ただし、その例はSAGEに依存します。私のユーザーは他の目的でSAGEを必要としない可能性が高いため、SAGEをインストールせずにモジュールをインストールできるようにしたいと思います。私のユーザーは、numpy、scipy、pandas、scikit learnなどのパッケージをインストールしている可能性が高いため、これらは妥当な依存関係になります。使用するインターフェースの最適な組み合わせは何ですか?また、コンパイルに必要な情報(numpy、scipyなどから)をフェッチできる最小のsetup.pyファイルはどのようになりますか?

編集: これが私がやったことです。それは私のMacBookで動作しますが、それがどれほどポータブルかはわかりません。確かにもっと良い方法があります。

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)
4

1 に答える 1

6

質問を正しく理解していれば、BLASおよびLAPACKルーチンにSciPyのCythonラッパーを利用できます。これらのラッパーはここに文書化されています:

ドキュメントに記載されているように、これらの関数に渡す配列が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 Cythonラッパーをコンパイルするために必要なソースファイルのみをここで分離し、それらをモジュールに独立した拡張機能としてバンドルすることが可能であるはずです。

実際には、これを行うのは非常に面倒です。linalgサブモジュールのビルドプロセスでは、さまざまなプラットフォームでのコンパイルを支援するためにいくつかのPython関数が必要です(たとえば、ここから)。ビルドは、他のCおよびFortranソースファイル(ここ)にも依存しており、そのパスはこれらのPython関数にハードコードされています。

明らかに、SciPyがさまざまなオペレーティングシステムやアーキテクチャで正しくコンパイルされるようにするために多くの作業が行われています。

可能だと確信していますが、ファイルをシャッフルしてパスを微調整した後、SciPyの残りの部分から独立してlinalgサブモジュールのこの部分を構築する正しい方法をまだ見つけていません。正しい方法を見つけたら、必ずこの回答を更新します。

于 2017-02-19T15:23:16.443 に答える