cuda核函数不执行的可能原因?

cuda核函数不执行的可能原因?

问题描述:

练习了一个矩阵乘法的例子,每个block配置16×16个thread,
当做5000×5000的矩阵乘法时,结果就全为0,核函数不执行不知道原因是什么?
每个grid每一维可以包含至少65535个block,算了下没有超出但是核函数没执行。。。

代码是在设备上运行的么,没有使用主机变量吧,没有爆内存吧,还有驱动程序对不对。你可以先测试自带的例子程序,排除环境问题。

#define blocksize 32
#define BLOCK_NUM 2048

global void matrix_mul(float M, float *N, float res,int L_cols,int L_rows, int R_cols)
{

int bid=blockIdx.x;
int row=threadIdx.y;
int col=threadIdx.x;
int blockRow,blockCol,r=(L_rows+blocksize-1)/blocksize,c=(R_cols+blocksize-1)/blocksize;
float sum;

for(int u=bid;u<r*c;u+= BLOCK_NUM)
{
sum=0;
blockRow=u%r;
blockCol=u/r;

for(int i=0;i<((L_cols+blocksize-1)/blocksize);i++)
{

shared float subA[blocksize][blocksize];
shared float subB[blocksize][blocksize];

if((blockRow*blocksize+row)<L_rows&&(i*blocksize+col)<L_cols)
subA[row][col]=M[(i*blocksize+col)*L_rows+blockRow*blocksize+row];
else
subA[row][col]=0;
if((blockCol*blocksize+col)<R_cols&&(i*blocksize+row)<L_cols)
subB[row][col]=N[L_cols*(blockCol*blocksize+col)+row+i*blocksize];
else
subB[row][col]=0;

__syncthreads();
for(int j=0;j<blocksize;j++)
sum+=subA[row][j]*subB[j][col];
__syncthreads();
}
if((blockRow*blocksize+row)<L_rows&&(blockCol*blocksize+col)<R_cols)
res[L_rows*(blockCol*blocksize+col)+blockRow*blocksize+row]=sum;

}
}


代码如上图,做10000×10000矩阵乘法结果就全是0了,但是算了下内存没超

原因有多种多样的:

(1)其中常见的一种是,32 * 32 = 1024线程的block大小,超出了贵卡的能力范围。
(需要fermi+的,请告知一下你的卡的信息)

(2)此外的一种常见原因是越界访存,请确保你用的数据(例如缓冲区)也随之相应扩大了。

没看到你是怎么invoke的,

不过5000*5000*sizeof(float)我目测是超了...
ps...每个thread都需要占用资源,是无法达到理论上限的。