gird是最大的结构,由参数griddim来表示由多少个block
block由参数blockdim来表示有多少个thread
一个线程执行完以后需要写入结果矩阵
我们假设AB矩阵分别为M*N和N*K,这样结果矩阵就是M*K
假规定blockDim是16*16*1
那么有
这样能覆盖到所有元素
明确一点就是,描述形状的是不包括0的描述位置的是包括0的
先不管边界条件,自然的想法是一个执行单元负责计算一个结果矩阵的元素,那么对于x,y位置的元素需要A矩阵的第x行和B矩阵的第y列,那么这里A和B都是数组,所以对于A,我们要算出前面有多少数据,
我们有的参数是结果矩阵的bloakidx和threadidx,那么行数就是,比如是第33行(这里包括编号0)
blockDim.y表示一个block有多少行线程,那么33/16就说明33行前面有两行块,那么blockIdx.y就是2
那么再加上threadIdx就可以得到前面有多少行,
ROW=blockIdx.y * blockDim.y + threadIdx.y;
也就是
前面的块数*一块里面的线程行数+该线程在自己块的行数
同理我们可以知道B的列数
那么最后到A里面找元素就是ROW*N开始,是第一个元素的位置,然后取完N行
对应B就是从第0行开始,往下数N行,都是COL这个位置,然后乘累加,放进结果矩阵对应的位置。
对于边界条件,就是下表可能会超出数组范围,我们加判断