我没有得到第9和第10行;通过公式Col + (m*TILE_WIDTH + ty)*Width
使用和计算索引。
有人可以帮助我理解这段代码,即使用__shared__
吗?
__global__ void MatrixMulKernel(float* Md, float* Nd, float* Pd, int Width)
{
__shared__float Mds[TILE_WIDTH][TILE_WIDTH];
__shared__float Nds[TILE_WIDTH][TILE_WIDTH];
3. int bx = blockIdx.x; int by = blockIdx.y;
4. int tx = threadIdx.x; int ty = threadIdx.y;
// Identify the row and column of the Pd element to work on
5. int Row = by * TILE_WIDTH + ty;
6. int Col = bx * TILE_WIDTH + tx;
7. float Pvalue = 0; ;
// Loop over the Md and Nd tiles required to compute the Pd element
8. for (int m = 0; m < Width/TILE_WIDTH; ++m) {
// Coolaborative loading of Md and Nd tiles into shared memory
9.Mds[ty][tx] = Md[Row*Width + (m*TILE_WIDTH + tx)];
10.Nds[ty][tx] = Nd[Col + (m*TILE_WIDTH + ty)*Width];
11.__syncthreads();
11. for (int k = 0; k < TILE_WIDTH; ++k)
12.Pvalue += Mds[ty][k] * Nds[k][tx];
13. Synchthreads();
}
Pd[Row*Width+Col] = Pvalue;
}
答案 0 :(得分:2)
__shared__
内存是GPU的快速(但很小)片上资源。
要乘以的矩阵从全局内存开始(Md
和Nd
)。第10和第11行:
Mds[ty][tx] = Md[Row*Width + (m*TILE_WIDTH + tx)]; // line 10
Nds[ty][tx] = Nd[Col + (m*TILE_WIDTH + ty)*Width]; // line 11
每个加载矩阵的“tile”(方形子部分)以将其乘以(Md
或Nd
)到共享内存副本(Mds
或{{1 }})。单行代码可以加载整个“tile”的原因是因为threadblock的所有线程都执行了这一行代码。结果,数据的线程块大小的“块”或“块”从全局移动到共享内存。
一旦它在共享内存中,实际的乘法在第14行完成。由于第14行是在共享内存而不是全局内存中运行的,并且因为在块中的相邻线程之间存在数据重用,所以整个乘法运算运行速度更快,因为共享内存可以比全局内存更快地访问。
提供了类似的代码和说明in the programming guide。