1

大きな固定オブジェクト、たとえば固定された大きなスパース (有向) グラフ、または同様の種類のオブジェクトに対して並列計算を実行したいとします。

グラフ内のランダム ウォークなど、このグラフまたはオブジェクトに対して適切な計算を行うために、グラフをグローバル メモリに配置することは、おそらく速度上の理由から問題外です。

これにより、ローカル/プライベート メモリが残ります。GPU アーキテクチャが正しいことを理解していれば、ローカル メモリとプライベート メモリの (読み取り専用) アクセスの間に実質的に速度の違いはありませんか? グラフをプライベート メモリにコピーすることには消極的です。これは、すべてのワーク ユニットがグラフ全体を格納する必要があることを意味し、GPU のメモリを非常に急速に消費する可能性があるためです (非常に大きなグラフの場合は、コアの数を減らしても使用したり、OS を不安定にしたりする可能性があります)。

では、ローカル対プライベートの読み取り速度について上記が正しいと仮定すると、実際にこれを行うにはどうすればよいでしょうか? たとえば単純化のために、グラフを anint[] fromと an int[] to(各有向辺の開始と終了を格納する) に縮小すると、もちろん、カーネルを次のようにすることができます。

computeMe(__local const int *to, __local const int *from, __global int *result) {
     //...
}

ただし、プライベート/ローカル/グローバル修飾子が指定されていないため、JOCL からこれを呼び出す方法がわかりません。

ローカル変数は、各ローカル ワークグループのメモリに自動的に書き込まれますか? または、これはどのように機能しますか?このメモリ割り当てを正しく行う方法がまったくわかりません。

4

2 に答える 2

3

ホストからローカル メモリ引数の値を渡すことはできません。ホストはローカル メモリを読み書きできません。ローカル メモリを使用するには、データをグローバルとして渡し、それを使用する前にグローバルからローカルにコピーする必要があります。これは、データを何度も読み取る場合にのみ役立ちます。

固定メモリはどうですか?入力データが変更されず、大きすぎない場合、入力データを定数メモリに配置すると、かなりの速度が向上する可能性があります。使用可能な定数メモリは通常、約 16K から 64K です。

computeMe(__constant int *to, __constant int *from, __global int *result) {
 //...
}

編集 (参照を追加):

OpenCL での __local メモリの使用例については、こちらを参照してください。

NVidia ハードウェアのパフォーマンスの詳細については、NVidia OpenCL ベスト プラクティス ガイド (PDF)を参照してください。そこには、メモリ タイプ間のパフォーマンスの違いに関する詳細情報があります。

于 2012-01-09T03:26:28.203 に答える