weixin_38256708
weixin_38256708
2018-07-15 08:54
采纳率: 36.4%
浏览 1.8k
已采纳

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • caozhy
    已采纳

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

    点赞 评论
  • weixin_38256708
    weixin_38256708 2018-07-16 05:39

    #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;

    }
    }

    
    
    点赞 评论
  • weixin_38256708
    weixin_38256708 2018-07-16 05:40

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

    点赞 评论
  • xq940919
    xq940919 2018-07-17 02:48

    原因有多种多样的:

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

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

    点赞 评论
  • zhuxinyue9099
    zhuxinyue9099 2018-07-22 09:16

    没看到你是怎么invoke的,

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

    点赞 评论

相关推荐