2017-06-20 11 views
2

私は別のSOユーザーを助けようとしています。その過程で、NumPy以外の単純な処理を行うCythonプログラムを作成することはできません。これは私にGILを強制します。そのため、OpenMP(マルチコア)を使用することは不可能です。興味深いポストを見つけましたが、SciPyからFortranのライブラリを直接、Cythonコード(BLAS、LAPACK)にインポートすることができます。私の場合はインテルMKL同等の機能でNumPyがインストールされています。私がしようとしているのは、1000x1000次元の2つのベクトルの単純なベクトル乗算で、もう1つは転置され、1000x1000行列になります。しかし、私はそのトリックを行う関連するFortranルーチン(NumPyの乗算に相当)を見つけることができません。すべてのルーチンは、代わりに行列の乗算を行うように見えます。したがって、SciPyの優れた機能は、import scipy.linalg.cython_blas as blascimport scipy.linalg.cython_lapack as lapackとなりました。理論的には、dgemmからFortranライブラリblas.dgemm(options)を呼び出して起動しましたが、単純に要素ごとの乗算ではなく行列積を行います。誰も1000x1000行列の結果、2つの1000x1ベクトル、単純な乗算を行うFortanモジュールを知っていますか?あなたが入力構文を追加することができればそれは素晴らしいでしょう。 Cの連続したメモリビューを関数[ie1] Cython NumPyベクトルに渡します。CythonでFortran NumPy操作をNOGILで使用すると、NumPy multiplyに相当するFortranライブラリーは何ですか?

+0

おそらくこれを行う必要はありません。 GILが必要な小さなGILを 'with gil:'ブロックで囲むことができます。乗算(おそらく)はGILを内部的に解放します。そうすれば他のコードとほぼ並行して実行できます(おそらく)。 – DavidW

+0

@DavidWそうです、私はそれをする必要はありませんが、Cythonのツールキットに追加したいのです...私はいつもPythonを使って作業しています。 ScipyとCythonに直接Fortanのポインタを持たせることは、その意味では非常に魅力的です。 – Matt

答えて

3

説明しているのは、"broadcasting"という純粋なNumPy機能です。これらのブロードキャスト操作は、C(またはCython)コードを使用して行われます。 PyNumber_MultiplyのようなPython C APIを使っていつでもCythonでアクセスすることができます(ただしGILはリリースされません)。通常Cythonの通常の乗算​​はその関数に委譲する必要がありますので、通常は呼び出す必要はありません。それは直接です。

BLAS/LAPACKは、線形代数の多くで使用されています。この目的のためにそこに公開されている関数を「使用する」ことができたとしても、NumPyの使用法は同じではありません。

+0

読んでいただきありがとうございます。私は2つのベクトルの要素ごとの乗算はHadamardプロダクトを使って行うことができると信じていますが、これはMKLのみです(つまり、 'scipy.linalg.cython_lapack'ファイルの定義は表示されません)。https://stackoverflow.com/a/29950051/6037118 MKLライブラリをインクルードする方法を示すCythonのサンプルファイルがあれば、 'vdmul'はライブラリです:https://software.intel.com/en-us/mkl-開発者リファレンス - fortran-v-mul – Matt

関連する問題