問題タブ [blas]
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.
c++ - double 配列をゼロ以外の値 (blas) で初期化する
大きな double ベクトルを割り当てました。100000 要素としましょう。コードのある時点で、すべての要素をゼロ以外の定数値に設定したいと考えています。すべての要素に対して for ループを使用せずにこれを行うにはどうすればよいですか? 役立つ場合は、blas パッケージも使用しています。
c - プロセッサ サブセット上の互いに素なグリッドと Scalapack でのそれらの通信
要約すると、私の質問は、Scalapack (BLACS) の 2 つの異なるプロセス グリッド上の 2 つのブロック周期的に分散されたマトリックス間でマトリックス コピーを実装する方法についてです。これを pdgemr2d_ で実装しようとしています。これは、同じプロセス グリッド上の 2 つのマトリックス間でコピーする場合に頻繁に使用します。
以下は、私が直面している問題の状態に関するかなり技術的な議論です。私はそれを基本的な問題に突き止めましたが、解決策があるようには見えません...ただし、Scalapack は私がしようとしているタイプの操作が可能であると具体的に述べているため、あるに違いありません。これの適切な例はどこにもありません。
C の MPI で実行される Scalapack の 1x1 計算グリッドの初期化は、通常、次のようになります。
このコードは、MPI が認識しているプロセッサの数に関係なく、1x1 グリッドを生成します (グリッドのサイズ {1, 1} が Cblacs_gridinit に渡されます)。ここで、CONTEXT は Scalapack 関数に対して、作業中のグリッドを示します (同時に複数を使用することができ、Cblacs_get によって生成されます)。Cblacs_gridinfo は、NPROW と NPCOL をプロセッサーの行と列の数 (この場合は {1, 1}) として設定します。MYPROW と MYPCOL は、どのグリッド ブロックが属するかを各プロセッサに示します。この場合、1x1 グリッドでは、1 つのプロセッサのみが参加し、そのグリッド ID は {0, 0} です。
単純なブロック巡回分散 100x100 行列の行列記述子の初期化も、通常は単純です。
(一部のプロセッサでは num_cols_local または num_rows_local が負の整数として正確に返されるため、「保護」変数が必要な理由については後で説明します。)
上記のほとんどは、descinit_ に渡される &zeros を除いて一目瞭然です。これは、行列の最初の行が分散されるプロセッサの行と、最初の列が分散されるプロセッサの列を示します。これらの値は、descinit_ 関数で使用される場合、非常に明示的な境界を持ちます。Fortran関数自体から、
{0,0} は単一のグリッド ブロックの適切なインデックスであるため、ここでは IRSRC と ICSRC をゼロとして渡します。グリッドがはるかに大きい場合でも、最初のプロセッサ ブロックが最初の行と列の値を格納する可能性が高いため、{0,0} を渡す可能性があります。
1 つのプロセッサで実行すると、これは非常にうまく機能します。NPROW、NPCOL、MYPROW、および MYPCOL の唯一のプロセッサである RANK 0 の値は、それぞれ 1、1、0、および 0 です。この場合の CONTEXT は 0 であり、非負であることは、それが参照するグリッドがこの RANK でアクティブであることを示します。これらの値は、1x1 プロセス グリッドの存在を示し、最初のプロセッサが正しいことを示し、RANK 0 に属する正しいプロセス グリッド ブロックを示します。この場合、それが唯一のブロックです。
ただし、2 つのプロセッサで実行すると、問題が発生するため、正式にはそうすべきではありません。1 番目と 2 番目の RANK には、CONTEXT、NPROW、NPCOL、MYPROW、および MYCOL があります。
すべての値は負です。最も重要なのは、RANK 1 の CONTEXT が負であることです。これは、この RANK が 1x1 プロセッサ グリッドに参加していないことを示しています。今すぐ descinit_ を呼び出すと、すべてのプロセッサですぐに問題になります。descinit_ から Fortran コードを参照すると、次のようになります (明確にするために上記を繰り返します)。
これらの制限は、各プロセッサがグリッドに参加している限り意味があります。このようなグリッド ブロックは存在しないため、インデックスを負にしたり、プロセス グリッド内の行または列の総数以上にすることはできません。
RANK 1 では、IRSRC はゼロとして渡されますが、NPROW と NPCOL はグリッドの初期化から -1 として返されるため、descinit_ は常に失敗します。
上記のすべては、マトリックス記述子の初期化とその後のすべての操作を現在のグリッドに参加しているプロセッサに制限するだけで、エレガントではありませんが簡単に克服できます。何かのようなもの:
ただし、プロセッサ グリッドは 1 つだけではなく 2 つあり、pdgemr2d_ 関数を使用して通信する必要があります。この関数の目的は、あるグリッドの分散行列 A のサブセットを別のグリッドの分散行列 B にコピーすることです。グリッドは互いに関連している必要はなく、部分的または完全にばらばらでもかまいません。これは簡単な操作です。たとえば、コンテキスト CONTEXT_A を持つプロセッサ グリッドからコンテキスト CONTEXT_B を持つプロセッサ グリッドに行列全体をコピーしたいとします。各コンテキストのマトリックスの記述子は、desc_A および desc_B として与えられます。
これもかなり自明です。いずれかのコンテキストがグリッド メンバーを持つすべてのプロセッサで実行する必要があります。私の場合、CONTEXT_A には MPI が認識しているすべてのプロセッサにまたがるグリッドがあり、CONTEXT_B は 1x1 のシングル プロセッサ グリッドです。
pdgemr2d_ には、少なくとも CONTEXT_A と CONTEXT_B の両方に含まれるすべてのプロセッサを含むコンテキスト識別子を指定する必要があります。また、CONTEXT_A または CONTEXT_B に属さないプロセッサについては、要素 desc_A[CTXT] または desc_B[CTXT] をそれぞれ - に設定する必要があります。そのプロセッサで 1。
Cblacs_gridinit によって返される CONTEXT 値は、そのコンテキストのグリッドに参加していないプロセッサでは -1 であるため、理論上、descinit_ はこれをエレガントに行います。ただし、descinit_ は、NPROW と NPCOL の負の値に関する上記の制限により、グリッドに参加していないプロセッサでは正しい行列記述子を生成しません。
適切な分離グリッド通信を行うには、いずれかのコンテキストに参加するすべてのプロセッサでこのような行列記述子を定義する必要があります。
明らかに、pdgemr2d_ は、コード内の関数の説明が具体的に述べているように、これを克服できない欠陥として記述することはできません。
PDGEMR2D は、A の部分行列を B の部分行列にコピーします。A と B は、異なる分布を持つことができます。異なるプロセッサ グリッド上に配置することも、異なるブロック サイズを使用することも、コピーする領域の開始を A の異なる場所にすることもできます。とB.
ご協力いただきありがとうございます。これはかなり専門的な質問であることは承知しています。
c++ - CUBLAS - 行列の追加..どうやって?
未知のサイズの 2 つの大きな行列を合計するために CUBLAS を使用しようとしています。(可能であれば) 完全に最適化されたコードが必要なので、行列加算コード (単純) を書き直すのではなく、CUBLAS、特に A と C (B が単位行列の場合) を合計できる cublasSgemm 関数を使用することにしました: *C = alpha*op(A)*op(B)+beta*c*
問題は次のとおりです。C および C++ は行列を行優先形式で格納しますが、cublasSgemm は (fortran との互換性のために) 列優先形式で動作することを意図しています。A と B を最初に転置するかどうかを指定できますが、C を転置するように指定することはできません。そのため、行列の追加を完了することができません..
行列の最大サイズは 20000x20000 程度なので、自分で C 行列を転置することはできません。
解決方法を教えてください。
blas - マトリックスを読み取り、それを操作するBLAS
マトリックスがメモリマップされていて、少し大きいのでそれを読み取ってブロックで処理する必要がある場合、それを読み取ってブロックごとに処理する方法はBLAS
?
c - このcコード/BLASエラーを修正するにはどうすればよいですか?
RのBLASlibを使用するac関数(後でRスクリプトで使用される)を作成しようとしています。
私は以下を使用してコードをコンパイルします:
エラーが発生します:
私は何が欠けていますか?
cuda - CUBLAS行列の乗算
CUDAで行列乗算を実装した後。私はそれをCUBLASで実装しようとしました(フォーラムの何人かの人々のアドバイスに感謝します)。
正方行列を乗算することはできますが、(もう一度...)非正方行列の操作に問題があります。動作する非正方行列乗算の唯一のタイプは、行列Aの幅(A * B = C)を変更する場合です。
エラーは発生しませんが、結果のマトリックスは間違った値を返します。これが私のコードです(これは基本的にsimpleCUBLAS SDKの例を応用したものです):
何かご意見は?また、誰かがCUBLASで動作している行列乗算の実装を持っているので、比較できますか?前もって感謝します。
python - BLAS sgemm/dgemm はどのように機能しますか?
sgemm
Pythonでctypesを使用してBLASで関数を利用しようとしています。C = A x Bを解こうとすると、次のコードは問題なく動作します。
ここで、この方程式を解きたいと思います: C = A' x Aここで、A'はAの転置であり、次のコードは例外なく実行されますが、返される結果は間違っています。
テストのために、行列A = [1 2;を挿入しました。3 4] . 正しい結果はC = [10 14; です。14 20]しかし、ルーチンはC = [5 11;sgemm
を吐き出します。11 25] .
私が理解している限り、アルゴリズムがそれを処理するため、行列Aを転置する必要はありません。2 番目のケースでパラメータを渡すと、何が問題になっていますか?
ヘルプ、リンク、記事、アドバイスをいただければ幸いです。
visual-c++ - Visual C ++ 2010およびLapack、Blasライブラリ
Blas
いくつかのルーティンを使用するためにライブラリを使用したいのですがLapack
、でそれらを使用する方法がわかりませんVisual C++ 2010
。
このコンテキストでそれらを使用する方法は?
visual-studio-2010 - Visual C/C++ 2010 の LAPACK
Visual C/C++ 2010 で LAPACK と BLAS を使用したい (Visual C/C++ 2010 に LAPACK と BLAS ライブラリを追加する) ため、ここで非常によく似た質問を読んでいました(同じですが、Visual C/C++ 2008 と同じです)、彼は主張します彼はそれを次のように解決しました:
私は自分の問題に対する答えを見つけました。問題は、LAPACK .lib ファイルを含むディレクトリをライブラリ ディレクトリのリスト ([ツール] -> [オプション] -> [プロジェクトとソリューション] -> [VC++ ディレクトリ] -> [ライブラリ ファイル]) に配置する必要があることを知っていたのに、そうしなければならないことを忘れていたことでした。 Project -> (Project Name) Properties -> Linker -> Input の「Additional Dependencies」に追加します。
Tools -> Options -> Projects and Solutions -> VC++ Directories Visualを取得した後、彼のソリューションに従おうとしたとき、C/C++ 2010 は VC++ ディレクトリが使用されていないと言います...
では、Visual C/C++ 2010 が認識できるように .lib を追加するにはどうすればよいでしょうか。
gcc - メモリにアラインされたコードとアラインされていないコードの混在
最近 GotoBLAS2 (MacOSX 10.6) をコンパイルして自分のコードにリンクしたところ、あらゆる種類の間違った結果が生じました。GotoBLAS からの不正な読み取りに気付いたので、すべてを valgrind で実行しました。もっと注意深く見てみると、GotoBLAS が -m128bit-long-double アライメント オプションでコンパイルされていることがわかりました。このフラグを使用してコードをコンパイルするとすぐに (長い double はまったく使用しませんが)、すべてが機能し、valgrind のあいまいさなしに正しい結果が得られます。
今私の質問です:
- 同じアライメント フラグを使用して、他のすべてのライブラリ依存関係をコンパイルする必要がありますか?