共有メモリをキャッシュとして利用すると、レジスタの使用量が減り、レジスタがローカル メモリに流出するのを防ぐことができます...
カーネルがいくつかの値を計算し、これらの計算された値がすべてのスレッドで使用されると考えてください。
__global__ void kernel(...) {
int idx = threadIdx.x + blockDim.x * blockIdx.x;
int id0 = blockDim.x * blockIdx.x;
int reg = id0 * ...;
int reg0 = reg * a / x + y;
...
int val = reg + reg0 + 2 * idx;
output[idx] = val > 10;
}
したがって、reg と reg0 をレジスタとして保持し、ローカル メモリ (グローバル メモリ) に流出させる可能性がある代わりに、共有メモリを使用することができます。
__global__ void kernel(...) {
__shared__ int cache[10];
int idx = threadIdx.x + blockDim.x * blockIdx.x;
if (threadIdx.x == 0) {
int id0 = blockDim.x * blockIdx.x;
cache[0] = id0 * ...;
cache[1] = cache[0] * a / x + y;
}
__syncthreads();
...
int val = cache[0] + cache[1] + 2 * idx;
output[idx] = val > 10;
}
詳細については、このペーパーを参照してください。