問題タブ [lapack]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
234 参照

matrix - Lapack + c + マトリックス

Lapack ルーチンの呼び出し方を教えてください。特に、DTRTRI (Uplo、DIAG、N、DA、LDA、INFO) を呼び出したいと考えています。

0 投票する
3 に答える
3617 参照

python - Python での密なコレスキー更新

Python(numpy)でCholesky分解で低ランクの更新を実行できるようにするライブラリ/コードを教えてもらえますか?Matlab は、この機能を「cholupdate」と呼ばれる関数として提供しています。LINPACKにもこの機能がありますが、(私の知る限り)まだLAPACKに移植されていないため、scipyなどでは利用できません。

scikits.sparse が CHOLMOD に基づいて同様の機能を提供することがわかりましたが、私の行列は密です。

numpy と互換性のある「cholupdate」の機能を備えた Python で使用できるコードはありますか?

ありがとう!

0 投票する
1 に答える
599 参照

c++ - Win32 上の LAPACK

私は、行列に何らかの作業を必要とするアルゴリズムを調査しており、Linux マシンで動作する単純なコードをいくつか取得しました。ここに抜粋があります:

私がしなければならなかったのはsudo apt-get install liblapack、ライブラリにリンクすることだけでした。

ここから 32 ビット dll を使用して MinGW からこのコードを動作させようとしていますが、セグメンテーション違反と無効な出力が表示されます。エラーの場所を特定するために gdb を使用しますが、これを行うには、より適切で、クリーンで、移植性の高い方法があると思います。

コンパイルするために私がしたことは、mingw( mingw-get install fortran) 用の fortran をインストールし、以前のリンクから 32 ビット BLAS および LAPACK dll にリンクすることでした。

ここでどれだけ欠けているかわかりません... gcc for win32でコーディングするとき、他の人はどのようにLAPACKを動かしていますか?

私が探しているのは、使いやすい C インターフェイスです。あちこちにラッパー クラスは必要ありません。

インテル® MKL のダウンロードを探してみました... フリー・ソフトウェアでさえありません!?

0 投票する
1 に答える
853 参照

c++ - MinGW:LAPACKおよびBLASとリンクすると、C++例外が処理されなくなります

状況は単純ですが、奇妙です。LinearAlgebra.oソース(LAPACKへのリンクが必要)なしでプログラムをコンパイルすると、C++例外がキャッチされて処理されます。そのコンパイルユニットを含めずにライブラリ(-llapack -lblas)にリンクすると、例外がキャッチされて処理されます。しかし、そこに入ると(コードは正常に実行されます)、C ++例外は正しく処理されなくなり、Windowsクラッシュハンドラー「プログラムが本社へのレポートの応答を停止しました」というナンセンスが発生します。

ここで、このソースファイル内で何が起こっているのかを明らかにします。私はそれをかなり単純に保ちました、しかしそれが本当にコーシャであるかどうかはわかりません。

これは、C++例外が機能しなくなる原因となるFORTRANルーチンの呼び出しに関するものだと思います。しかし、私はこれを修正する方法がわかりません。

アップデート:

この問題の一時的な回避策を見つけて非常にうれしく思います。MinGWのgfortranコンパイラを使用して、現在使用しているLAPACKおよびBLASルーチンを直接コンパイルしています。

-lgfortranを使用してこれらのオブジェクトファイルをC++プロジェクトにリンクするg++と、問題なく動作しますが、例外は引き続き正しく処理されます。ボーナスとして、これにより、使用する予定のLAPACKルーチンのみを含めることができるため、最大4MBのライブラリをリンクする必要がなくなりました。

編集:私がライブラリを静的にリンクする場合、それは「必要なものをつかむ」だけなので、その場合は4MBであっても問題ないと思います。

0 投票する
0 に答える
874 参照

c++ - GotoBLAS2のパフォーマンス

LAPACKルーチン、、、およびを使用して、パックされた対称行列の反転と乗算を実行するコードがDPPTRFありDPPTRIますDSPMVこれは、 LAPACKルーチンを呼び出すために使用するC++コードを見ることができる古いトピックです。

私のコードは現在、ほとんどが対角線に沿って配置されている対称行列を組み立てています。

さまざまなBLASおよびLAPACK実装をテストしており、GotoBLAS2をnetlibの参照LAPACK実装と比較しています。

これが私がnetlibLAPACKコードをコンパイルする方法です。.fソースからコードファイルを選択し、それらをすべて次のようなコンパクトな静的ライブラリにコンパイルします。

次に、を使用してこのライブラリをC++アプリケーションにリンクできます-llapack_lite -lgfortran

次に、GotoBLAS2を使用してみました。ここからもらった。パッケージには、19MBの大規模な静的ライブラリを自動的にコンパイルするスクリプトが含まれていました。リンクすることで、既存のコードとうまく連携します-lgoto2_nehalemp-r1.13

最初はうまくいったと感じました。GotoBLAS2を使用すると、大きな問題セット(1000x1000以上の行列を反転する)で、パフォーマンスが約6倍向上することがわかりました。GotoBLASは私のアーキテクチャ用にスレッド化されており、リファレンスLAPACKはシングルスレッド化されているので、これは妥当だと思いました。システムモニターは、確証するために300%を超えるCPU使用率も示しました。

ここがおかしくなるところです。リファレンス実装を最適化するとどうなると思いますか?

lapack_litelibを次のように再コンパイルします。gfortran -c -O3 *.f

私のlapack_litelibは、 1つのスレッドのみを使用して、3200x3200のマトリックス反転でもGotoBLAS2よりも優れています。また、RAMの消費量が最大80MB少なくなります。

ただし、後続のパックされた行列-ベクトルの乗算は、GotoBLASを使用するとより高速に行われます。

これはリモートでも可能ですか?GotoBLASパッケージのmake構成は、gfortranで最適化スイッチを使用できませんでしたか?

0 投票する
1 に答える
678 参照

fortran - BLAS2のCとFortran

私は、多くのノルム、内積、そして最も重要なことに、行列ベクトルの乗算を実行する必要があるアプリケーションを持っています。

行列とベクトルは巨大です。マトリックスの寸法は100000x100000になる傾向があります

ループ構造は次のとおりです。

現在、IntelMKLでIntelFortranを使用しています。IntelMKLを使用してIntelCでコードを書き直すことは役に立ちますか?誰かが何らかのベンチマークを実行したことがありますか(特にDGEMVの場合)?コードを書き直すのは大変な苦痛ですが、理由がわかれば書き直してもかまいません。

編集:私は誤解しました:マトリックスの寸法は100万ではなく100000です。かなり深刻なエラー:|

そして、はい、マトリックス高密度であり、高密度である必要があります。さらに、それは対称的ではなく、正の明確ささえありません。私のアルゴリズムはQMRの修正バージョンです。

0 投票する
1 に答える
908 参照

memory-leaks - dgemm_のメモリリーク

私は現在、blasルーチンへの多数の呼び出しを含むアプリケーションに取り組んでいます。dgemm呼び出しでバイトが失われていることを発見した、メモリリークを定期的にチェックしています。呼び出しは次のようになります。

A、B、およびCは、サイズn*nのダブルフィールドです。valgrindの出力は次のとおりです。

マトリックスの寸法を確認しました。期待通りです。dgemm_呼び出しがどのようにそのようなリークを引き起こす可能性があるのか​​わかりません。違法な書き込みや読み取りを理解できました。しかし、dgemm_がどのようにリークを引き起こす可能性があるのか​​わかりません。

0 投票する
2 に答える
610 参照

mpi - MPI と OpenMP。私にも選択肢がありますか?

より高速に実行しようとしている線形代数コードがあります。これは、ループと行列ベクトルの乗算を含む反復アルゴリズムです。これまでのところ、MATMUL (Fortran Lib.)、DGEMV を使用しました。OpenMP で独自の MV コードを作成しようとしましたが、アルゴリズムはスケーラビリティの点で優れていません。割り当てているプロセッサの数に関係なく、スピードアップはかろうじて 3.5 ~ 4 です (64 個のプロセッサを試しました)。プロファイリングは、Matrix-Vector でかなりの時間が費やされていることを示しており、残りはごくわずかです。私の質問は、大量の RAM とプロセッサを備えた共有メモリ システムを使用していることです。コードの OpenMP 実装 (Matrix Vector を含む) を微調整しようとしましたが、役に立ちませんでした。MPI でのコーディングは役に立ちますか? 私は MPI のプロではありませんが、メッセージ通信を微調整する機能は少し役立つかもしれませんが、確信は持てません。コメントはありますか?

より一般的には、私が読んだ文献によると、MPI = Distributed、OpenMP = Shared ですが、それらは他の領域でうまく機能しますか? Shared の MPI のようなものですか? それはうまくいきますか?うまくやれば、OpenMP 実装よりも優れていますか?

0 投票する
1 に答える
1098 参照

mex - mex ファイルで CLAPACK、BLAS、または LAPACK を使用するにはどうすればよいですか?

逆行列を取るなどの単純な線形演算を実行できる MATLAB で MEX ファイルを作成するのに問題があります。Visual Studio 2010 を使用して逆行列を取得し、MEX ファイルを正常に作成できたので、これら 2 つの概念をまとめることだけが問題です。MathWorks サイトから入手した MEX サンプル コードをコンパイルしようとしましたが、うまくいきませんでした。

これが私が試したことです、

  1. MathWorks から取得したファイルを .c 拡張子として保存 (名前を変更) し、MATLAB でコンパイルしようとしました。

    ライブラリ C:\Users\CIT\AppData\Local\Temp\mex_bKHjrl\templib.x およびオブジェクト C:\Users\CIT\AppData\Local\Temp\mex_bKHjrl\templib.exp eko1.obj の作成: エラー LNK2019: 未解決の外部シンボル関数 mexFunction eko1.mexw64 で参照されている dgesv: 致命的なエラー LNK1120: 1 つの未解決の外部

  2. また、.cpp ファイルとしてコンパイルしようとしましたが、memcpy 関数を認識しなかったためにエラーが発生しました。

  3. これらが機能しなかったので、LAPACK ライブラリのサブルーチン dgetrf と dgetri を使用する独自のプログラムを作成しましたが、エラーが発生しました。

    c:\users\cit\documents\matlab\f2c.h(16): エラー C2371: 'complex': 再定義; 異なる基本型 C:\Program Files\MATLAB\R2011b\extern\include\lapack.h(39) : 「complex」の宣言を参照 c:\users\cit\documents\matlab\f2c.h(17) : エラー C2371 : 'doublecomplex' : 再定義; 異なる基本型 C:\Program Files\MATLAB\R2011b\extern\include\lapack.h(40) : 'doublecomplex' の宣言を参照 eko2.cpp(29) : エラー C2057: 期待される定数式 eko2.cpp(29) :エラー C2466: 定数サイズ 0 の配列を割り当てることができません。 'ptrdiff_t *' へ 指す型は無関係です。変換には reinterpret_cast が必要です。C スタイルのキャストまたは関数スタイルのキャスト eko2.cpp(34): エラー C2664: 'dgetri': パラメーター 1 を 'integer *' から 'ptrdiff_t *' に変換できません。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

皆さんが私に与えてくれるどんな助けも非常に高く評価されます

前もって感謝します。