次のカーネルがあります。
__global__ void myKernel(int k, int inc, int width, int* d_Xco, int* d_Xnum, bool*
Xvalid, float* d_X)
{
int i, k1;
i = threadIdx.x + blockIdx.x * blockDim.x;
//k1 = threadIdx.y + blockIdx.y * blockDim.y;
if( (i < k) ){
for(k1 = 0; k1 < inc; k1++){
int mul = (d_X[i*inc + k1] >= 2e2);
d_X[i*inc + k1] *= (float)(!mul);
d_Xco[i*width + k1] = k*mul;
d_Xnum[i] += mul;
d_Xvalid[i*inc + k1] = (!mul) ;
}
}// of if
}
これは次のように呼び出されます:
int bx = (int)(k/32)+1;
int by = (int)(inc/32)+1;
dim3 b(bDim, 1);
dim3 t(tDim, 1);
cmyKernel<< b, t >>>( k, inc, width, d_Xco, d_Xnum, d_Xvalid, d_X );
cudaThreadSynchronize();
k
は約 9000 で、inc
約 5000 ですので、ブロック数を超えていないと確信しています。myKernel
が次元で 1thread/1block で呼び出された場合y
、カーネルは正常に動作しているように見えますが、たとえば、次元のスレッドとブロックの数y
を 10 に変更すると、カーネル内で実際に使用していない場合でも、間違った出力が得られます。のスレッドとブロックy
。for()
理想的には、私は使用を取り除きたいですk = threadIdx.y + blockIdx.y * blockDim.y