我有以下内核:
__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
是9000inc
左右,5000左右,所以我确定我没有超过块数。如果myKernel
在y
维度中使用 1thread/1block 调用,内核似乎工作正常,但是,例如,只需将y
维度中的线程和块数更改为 10,它会给出错误的输出,即使在内核中我并没有真正使用中的线程和块y
。理想情况下,我想摆脱for()
使用k = threadIdx.y + blockIdx.y * blockDim.y