第二章
3.使用一维网格和一维块对矩阵求和
前面我们使用了二维网格和二维块对矩阵求和,这种分割是非常直观的。那么现在我们就要使用抽象一点的概念,以稍复杂的编程来获得可能能取得的更高的性能。这就需要我们对映射有比较好的深入了解。
首先,我们再复习一下一维网格和一维块的结构:
其中,nx是x方向上最大的线程数,ny是一个线程需要处理的数据元素个数(因为这个块是一维的,照理来说是不应该有ny的)。所以这里只有ix是对线程的真正索引,iy是线程内部数据的索引(这个时候要把线程看成一个大的单位,里面是由ny个子线程组成的,每个子线程依次处理一个数据。但一定要记住,这个子线程实际上并不存在,是并行里面的串行)。
那么每个数据的idx就依然满足idx=iy*nx+ix;其中iy是从0迭代到ny的。
所以我们写出核函数:
__global__ void sumMatrixOnGPU1D(float *MatA,float *MatB,float *MatC,int nx,int ny)
{
unsigned int ix=threadIdx.x+blockIdx.x*blockDim.x;//获得x方向上的网格坐标
if(ix<nx)//防止越界
{
//从这里开始,就已经是线程里面的串行了
for(int iy=0;iy<ny;i++)
{
int idx