__shared__如何在以下代码中工作?

时间:2016-03-28 16:52:35

标签: c++ cuda

我没有得到第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; 
  }

1 个答案:

答案 0 :(得分:2)

__shared__内存是GPU的快速(但很小)片上资源。

要乘以的矩阵从全局内存开始(MdNd)。第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”(方形子部分)以将其乘以(MdNd)到共享内存副本(Mds或{{1 }})。单行代码可以加载整个“tile”的原因是因为threadblock的所有线程都执行了这一行代码。结果,数据的线程块大小的“块”或“块”从全局移动到共享内存。

一旦它在共享内存中,实际的乘法在第14行完成。由于第14行是在共享内存而不是全局内存中运行的,并且因为在块中的相邻线程之间存在数据重用,所以整个乘法运算运行速度更快,因为共享内存可以比全局内存更快地访问。

提供了类似的代码和说明in the programming guide