値の大きな配列 (まだ 64 kB より小さい) があるとします。これはカーネルで非常に頻繁に読み取られますが、書き込まれることはありません。ただし、外部から変更することはできます。配列には 2 つの値のセットがあり、それらを left と right と呼びましょう。問題は、大きな配列を __global として取得し、それを __local left および __local right 配列に書き込む方が高速かどうかです。または定数 __constant として取得し、カーネルでアクセスを処理しますか? 例えば:
__kernel void f(__global large, __local left, __local right, __global x, __global y) {
for(int i; i < size; i++) {
left[i] = large[i];
right[i] = large[i + offset];
}
...
x = foo * left[idx];
y = bar * right[idx];
}
対:
__kernel void f(__constant large, __global x, __global y) {
...
x = foo * large[idx];
y = bar * large[idx * offset];
}
(インデックス作成はもう少し複雑ですが、たとえば、マクロを使用して作成できます) 定数メモリはグローバル空間にあると読みましたが、遅くする必要がありますか? Nvidia カードで動作します。