最近使用共享内存写了一个矩阵乘法的程序,kernel以及相关的host端程序如下,其中N代表矩阵的大小,blocksize*blockssize为每个block中的线程数
global void kernel(int a_d,int b_d,int c_d)
{
shared int a_share[BlockSizeBlockSize],b_share[BlockSizeBlockSize];
int t = 0;
int x = threadIdx.x+blockIdx.xblockDim.x;
int y = threadIdx.y+blockIdx.y*blockDim.y;
if (x+yN < NN)
{
a_share[threadIdx.x+threadIdx.yBlockSize] = a_d[x+yN];
b_share[threadIdx.x+threadIdx.yBlockSize] = b_d[x+yN];
}
else
{
a_share[threadIdx.x+threadIdx.yBlockSize] = 0;
b_share[threadIdx.x+threadIdx.yBlockSize] = 0;
}
__syncthreads();
for (int i = 0;i<BlockSize;i++)
{
t += a_share[i+threadIdx.y*BlockSize]b_share[threadIdx.x+iBlockSize];
}
c_d[x+y*N] = t;
}
host端相关定义如下
dim3 threadsPerBlock(BlockSize,BlockSize);
dim3 blockPerGrid((N-1+BlockSize)/BlockSize,(N-1+BlockSize)/BlockSize);
kernel<<<blockPerGrid,threadsPerBlock>>>(a_d,b_d,c_d);
现在问题在于,当N较小的时候,如2000以内,计算都没有问题,但当N大于3000时,计算会出错。而且由于已经关掉了TDR,有时候会出现假死的情况,即鼠标动不了,呼叫任务管理器也没有反应。请问斑竹这是怎么回事?