問題タブ [cublas]
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.
cuda - シンプルな CUBLAS 行列乗算の例?
高性能 GPU 操作を使用して、次のコードの M を N 倍し、結果を P に配置できる CUBLAS の非常に基本的な行列乗算の例を探しています。
これまでのところ、CUBLAS を使用して任意の種類の行列乗算を行うために見つけたほとんどのコードは (一見?) 過度に複雑です。
GPU での行列乗算と CPU での行列乗算のパフォーマンスを学生が比較できる基本的なラボを設計しようとしています。おそらく GPU でのパフォーマンスが向上しています。
c - blasを使用して最適な方法で行列を転置する方法は?
私はいくつかの計算を行っており、さまざまなBLAS実装の力と弱点について分析を行っています。しかし、私は問題に遭遇しました。
私はcuBlasをテストしていますが、GPUでlinAlgを実行するのは良い考えのように思えますが、1つの問題があります。
列メジャー形式を使用したcuBlasの実装。これは最終的に必要なものではないため、BLASに行列転置を実行させる方法があるかどうか知りたいです。
cuda - CUBLAS は予期しない動作をします
CUDA+CUBLAS を使用して最初のプログラムを作成しました。「cublasDgemm」関数を使用して、2 つの N*N 行列の積を計算するだけです。
しかし、プログラムを起動している間ずっと、同じ間違った答えを出し続けていました (例えば、単一の要素として 5 を含む 1*1 行列を要素 6 を含む 1*1 行列で乗算すると、結果は常に 36 ではなく 36 と表示されます)。 30)。プログラムを数回チェックしましたが、成功しませんでした。しかし、翌日(つまり、再起動後)に戻ったときは、問題なく機能していました。再コンパイルしたかどうかは覚えていませんが、実は同じ VS プロジェクト、同じコード、GPU を搭載した同じコンピューターです。
では、なぜそれが起こったのか、誰か説明してもらえますか? そして、同じ奇妙な振る舞いをさらに期待する必要がありますか?
これが私が起動していたコードです:
performance - CUBLASdgemmパフォーマンスクエリ
これらは、各GPU(Tesla M2050)に2つのストリームを使用して4つのGPUでcublasDGEMMを実行した結果です。
私は自分の結果をテストしましたが、問題ありません。デフォルトのストリームを使用するバージョンと比較して、取得している高いGflops値が心配です。次の式を使用してGflopsを計算しています。
Gflops = {2.0*10^-9*(N^3+N^2)}/elapsed_time_in_s
複数のストリームを使用するバージョンの場合、この式を何らかの方法で変更する必要がありますか?
これ HtoD-ker-DtoH
は、ホストからデバイスへのデータ転送、カーネルの実行、およびデバイスからホストへのデータ転送にかかる時間(秒単位)です(これは上記の式の分母です)。Nvidiaフォーラムへのクロスポスト-http://forums.nvidia.com/index.php?showtopic=219910&st=0# entry1350908
編集:@talonmiesのコメントに続いてcudaStreamSynchronize
、時間を計算する前にaを追加しました。結果は、次のとおりです。
ありがとう、
サヤン
casting - CUDA と cuBLAS での型キャスト
cuda でプログラムを書いており、データ転送のオーバーヘッドを削減しようとしています。行列の乗算に cuBLAS ライブラリを使用しており、値の範囲が 0 ~ 255 の 30.000.000 の数値を送信する必要があります。
最終製品を float にしたいので、今は float として送信しています。これは、1 バイトに収まることを考えると、非常にコストがかかります。
cuBLAS ライブラリまたはその他の高速数学ライブラリを使用しているときに、それらをバイトとして送信し、フロートとして型キャストする方法はありますか? または、何らかの方法でフロートとして整列するように GPU に指示しますか?
c++ - 1 回の操作で複数の行列間乗算を実行する
本質的に、次のような一連の行列 - 行列乗算であるアルゴリズムを実装しています。
私の行列は本当に小さい 100x100 フロートですが、シーケンスは非常に長く、数十億のオーダーです。
行列の乗算に CUBLAS を使用してみましたが、これは遅かったのですが、興味深いことに気付きました。
100x100 を 100x100 マトリックスで乗算するのは遅かったが、1.000.000x100 を 100x100 で乗算するのは比較的高速だった。これは非常に高速であるはずです。これが完了したときに行列を乗算すると、同じ結果が得られますが、より速くなります。
M_1 ... M_n が約 100 の異なる行列のセットに含まれていることは何の価値もないため、スペースの消費は実際には問題ではありません。必要なのは、1 回の操作で複数の乗算を行うことだけです。
ここに私の問題があります。nvidiaがドキュメントで示しているものに触発されたmatrix-matrix(sgemm)実装を行いましたが、cublasの約4倍遅いです。CUBLAS の仕組みを知っている人はいますか? そして、コードがどこかで利用できる場合は?
python - cublas cublasZgemm() が予想より遅い
nvidiaによると. cublasZgemm は intel MKL よりも 6 倍高速です。
ただし、私の PC (i7 2600、Nvidia gtx560、OS:linux 64bit) では、cublasZgemm は MKL よりもわずかに遅くなります。
MKL 10.3 に対して numpy をリンクする熟考されたpython ディストリビューションに付属する numpy.dot() を使用します。
cublasZgemm を使用した行列乗算関数は、共有ライブラリにコンパイルされ、Python スクリプトで ctypes を使用して呼び出されます。
2 つの 1024x1024 複素行列を乗算する場合。numpy.dot() には 84 ミリ秒かかりました。ctypes 関数の呼び出しに 110 ミリ秒、cublasZgemm() の部分に 97 ミリ秒かかりました。
cublassZgemm が nvidia が述べたほど速くないのはなぜですか?
c - CUBLAS / CUSPARSE操作で単一化された配列の要素を0に設定するのは安全ですか?
たとえば、さまざまな行列-ベクトル-乗算の結果を累積する場合(これは、累積要素が1つしかない場合でもBLASで行うことです)、正式にはゼロベクトルで始まります。しかし、CUDAデバイスメモリにゼロの配列を直接割り当てるオーバーヘッドのない方法はありません(またはありますか?)ので、頭に浮かぶ解決策は、0に初期化する代わりに、任意の数の配列を取得することです。 、またはbeta = 0.
の最初の呼び出しに値を渡します。結局のところ、それがそのパラメータを持っているなら、「なぜそれを使わないのか」。cublas<t>gemv
cusparse<t>csrmv
これは
- いい考え?または、β = 1の場合、配列を0に初期化してから呼び出しを使用するために、全体的にパフォーマンスが向上するように最適化されています
cusparseDcsrmv(..., 1., zeroes_array)
か? - 安全な?素朴なことに、 ℝ要素の表現としての浮動小数点はx⋅0 = 0∀xを満たす必要がありますが、この素朴な扱いは、浮動小数点を扱う場合はもちろんかなり致命的です。アレイが以前に同じデータ型で他の操作に使用され、結果が正常に動作した場合は安全だと確信していますが、新しく割り当てられたデバイスメモリの単一化されたブロックに対しても安全ですか?
密な行列の場合、乗算のO(n² )の複雑さにより、ベクトルのO(n)割り当てのパフォーマンスについてあまり推論する必要がないため、私は主にスパースの場合に関心があります。
c++ - CUBLASで最大値と最小値を見つける
CUBLASを使用してdoubleの範囲で最大値と最小値を検出する関数が正しく機能しない理由を理解するのに問題があります。
コードは次のとおりです。
ここで、valuesは検索する値です。max_idxとmin_idxは、値で見つかった数値のインデックスです。CUBLAS呼び出しの結果はかなりランダムに見え、間違ったインデックスを出力します。
私の問題に対して非常に良い答えを持っている人はいますか?私は今少し悲しいです:(
cuda - CUDAの不適切な使用により、「外部シンボル_cublasDestroy_v2@4」エラーが発生する可能性があります
マトリックス CUBLAS 演算をコンパイルしようとすると、次のエラーが発生します。
このエラーが CUDA の新しい 4.2 ではなくバージョン 4.1 を使用することによって引き起こされる可能性があるかどうかは誰にもわかりませんか?