大きな固定オブジェクト、たとえば固定された大きなスパース (有向) グラフ、または同様の種類のオブジェクトに対して並列計算を実行したいとします。
グラフ内のランダム ウォークなど、このグラフまたはオブジェクトに対して適切な計算を行うために、グラフをグローバル メモリに配置することは、おそらく速度上の理由から問題外です。
これにより、ローカル/プライベート メモリが残ります。GPU アーキテクチャが正しいことを理解していれば、ローカル メモリとプライベート メモリの (読み取り専用) アクセスの間に実質的に速度の違いはありませんか? グラフをプライベート メモリにコピーすることには消極的です。これは、すべてのワーク ユニットがグラフ全体を格納する必要があることを意味し、GPU のメモリを非常に急速に消費する可能性があるためです (非常に大きなグラフの場合は、コアの数を減らしても使用したり、OS を不安定にしたりする可能性があります)。
では、ローカル対プライベートの読み取り速度について上記が正しいと仮定すると、実際にこれを行うにはどうすればよいでしょうか? たとえば単純化のために、グラフを anint[] from
と an int[] to
(各有向辺の開始と終了を格納する) に縮小すると、もちろん、カーネルを次のようにすることができます。
computeMe(__local const int *to, __local const int *from, __global int *result) {
//...
}
ただし、プライベート/ローカル/グローバル修飾子が指定されていないため、JOCL からこれを呼び出す方法がわかりません。
ローカル変数は、各ローカル ワークグループのメモリに自動的に書き込まれますか? または、これはどのように機能しますか?このメモリ割り当てを正しく行う方法がまったくわかりません。