2016-04-01 3 views
3

私は、cuSPARSEのcusparseScsrmmを使用して、疎な行列密度行列の乗算を実行する単純なルーチンを実装しています。これは、cudaMalloc(99%以上)またはcudaMallocPitch(ごくまれにしか使用されていない)を使用してGPUにメモリを割り当てることができる、より大きなアプリケーションの一部です。 cuSPARSEがピッチメモリをどのように扱うのかに関するいくつかの質問があります。cuSPARSEライブラリとcuBLASライブラリは、cudaMallocPitchを使用して割り当てられたメモリをどのように処理しますか?

1)私はcuSPARSEルーチンにピッチメモリを渡しましたが、結果は正しくありませんでした。(予想通り、引数)。これらのライブラリをcudaMallocPitchを使って割り当てられたメモリで動作させる方法はありますか?

2)これに対処する最善の方法は何ですか?私はちょうどメモリがピッチモードを使用して割り当てられていないことを強制するために、呼び出し関数にチェックを追加する必要がありますか?

答えて

4

疎行列演算の場合、ピッチデータの概念はとにかく関連性がありません。

高密度マトリクス演算の場合、大部分の演算はデータ自体の「ピッチ」を直接サポートしませんが、サブマトリクスに対してはさまざまな演算が可能です。特定の注意点があると、そのような操作でピッチデータやピッチのないデータを処理することは可能です。 「リーディングディメンション」引数を受け入れるCUBLAS(またはCUSPARSE)操作が表示されるたびに、それらの引数を使用してデータのピッチを囲むことができます。

の行列要素に "leading dimension"パラメータが指定されていてピッチが(通常は)バイト単位で指定されているため、ここでの注意点は、ピッチが問題の行列要素のサイズで均等に割り切れ、ピッチ(バイト単位)を行列要素で指定された「先頭次元」パラメータに変換することができます。 cudaMallocPitchによって返されるピッチ数量は通常16で割り切れると私は考えていますが、これは通常charintfloatdoubleなどのタイプで可能です。このアプローチを使用する場合は、時間のチェックをお勧めします。

例えば、ldaldbldcパラメータの適切な仕様と、ピッチデータにCUBLASマトリックス・マトリックス乗算(gemm)を行うことが可能であるべきです。

operation you indicateは、関係する密行列のためのそのような主要なパラメータを提供します。

ユースケースの99%がピッチデータを使用しない場合、私はピッチデータをサポートしていないか、または主要ディメンションパラメータが利用できない操作の場合は、ピッチなしデータをパッチなしバッファにコピーします所望の操作に使用するためのものである。ピッチ変換されていないコピーにピアツーピアされたデバイスは、ほぼメモリ帯域幅の速度で動作するため、使用ケースの1%では重大な問題ではないほど高速に動作する可能性があります。

関連する問題