nSight プロファイラーは、次のカーネルがスレッドごとに 52 個のレジスターを使用していることを示しています。
//Just the first lines of the kernel.
__global__ void voles_kernel(float *params, int *ctrl_params,
float dt, float currTime,
float *dev_voles, float *dev_weasels,
curandStateMtgp32 *state)
{
__shared__ float dev_params[9];
__shared__ int BuYeSimStep[4];
if(threadIdx.x < 4)
{
BuYeSimStep[threadIdx.x] = ctrl_params[threadIdx.x];
}
if(threadIdx.x < 9){
dev_params[threadIdx.x] = params[threadIdx.x];
}
__syncthreads();
float currVole = curand_uniform(&state[blockIdx.x]) + 3.0;
float currWeas = curand_uniform(&state[blockIdx.x]) + 0.1;
float oldVole = currVole;
float oldWeas = currWeas;
int jj;
if (blockIdx.x * blockDim.x + threadIdx.x < BuYeSimStep[2])
{
int dayIndex = 0;
/* Not declaring any new variable from here on, just doing arithmetics.
....... */
各レジスタに 4 バイトがある場合、配列 params[9] と ctrl_params[4] がレジスタで終わると仮定しても、どうやって 52 個のレジスタに到達するのか理解できません (この場合、私が行ったように共有メモリを使用しても作成されません)。検出)。占有率を上げたいのですが、なぜそんなに多くのレジスターを使用しているのかわかりません。何か案は?