私は別の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 blas
と cimport 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ライブラリーは何ですか?
答えて
説明しているのは、"broadcasting"という純粋なNumPy機能です。これらのブロードキャスト操作は、C(またはCython)コードを使用して行われます。 PyNumber_Multiply
のようなPython C APIを使っていつでもCythonでアクセスすることができます(ただしGILはリリースされません)。通常Cythonの通常の乗算はその関数に委譲する必要がありますので、通常は呼び出す必要はありません。それは直接です。
BLAS/LAPACKは、線形代数の多くで使用されています。この目的のためにそこに公開されている関数を「使用する」ことができたとしても、NumPyの使用法は同じではありません。
読んでいただきありがとうございます。私は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
- 1. CythonでNumpyのPyArray_IsScalarを使用する
- 2. num2cell()のpython/numpyに相当するのは何ですか?
- 3. numpyのargsortに相当するjavascriptは何ですか?
- 4. numpyでscipy.signal.lfilterに相当する
- 5. numpy配列をFortranにすばやくロードする
- 6. Fortranで派生型ポインタと多相ターゲットを使用する
- 7. pythonのzip(*)のnumpyに相当するものは何ですか?
- 8. 構造化numpy配列のnumpy.allcloseに相当するものは何ですか?
- 9. NumPyはFortranの順序配列にデータを直接ロードできますか?
- 10. Cythonとnumpyの
- 11. Fortranのために柱ベクトルのPython numpyの中に作成
- 12. Matlabのassigninに相当するNumpy/IPython
- 13. Python Numpyの "whos"コマンドに相当する
- 14. PythonでR repとrep_len関数のnumpyに相当する
- 15. numpyは私のFortranルーチンよりもずっと高速でしょうか?
- 16. numpyの配列順序をfortran形式に強制するにはどうすればいいですか?
- 17. numpyに相当するMatlabのバッファはありますか?
- 18. Fortranのリスト指向入力のPythonに相当する
- 19. Cray Fortran Wrapperのmpif90 --showmeに相当するftn
- 20. MATLAB meshgrid関数のFortranに相当しますか?
- 21. 使用はFORTRAN
- 22. C_INT Fortranタイプの必要性は何ですか? CとFortranの整数はどう違うのですか?
- 23. C#相当のNumpy Where
- 24. numpy配列with cython
- 25. fortranコードのgprof出力で_IO_wfileとは何ですか?
- 26. 配列の割り当てnumpy /:コロンに相当する
- 27. CythonのFortran共通変数へのアクセス
- 28. Cython numpy配列インデックス
- 29. AFnetworking 2.0とは何ですか?キャンセル操作に相当します
- 30. Cython型のメモリビュー:彼らは本当に何ですか?
おそらくこれを行う必要はありません。 GILが必要な小さなGILを 'with gil:'ブロックで囲むことができます。乗算(おそらく)はGILを内部的に解放します。そうすれば他のコードとほぼ並行して実行できます(おそらく)。 – DavidW
@DavidWそうです、私はそれをする必要はありませんが、Cythonのツールキットに追加したいのです...私はいつもPythonを使って作業しています。 ScipyとCythonに直接Fortanのポインタを持たせることは、その意味では非常に魅力的です。 – Matt