为什么CUDA共享内存比平铺矩阵乘法中的全局内存慢?

时间:2017-12-04 15:47:53

标签: c++ memory cuda

我有平铺矩阵乘法代码,有和没有共享内存。下面是使用全局内存的矩阵乘法:

__global__ 
void MatrixMulKernel(float* M, float* N, float* P, int Width)
{
int Row = blockIdx.y*blockDim.y + threadIdx.y;
int Col = blockIdx.x*blockDim.x + threadIdx.x;
if ((Row < Width) && (Col < Width)) {
    float Pvalue = 0;
    for (int k = 0; k < Width; ++k)
    {
        Pvalue += M[Row*Width + k] * N[k*Width + Col];
    }

    P[Row*Width + Col] = Pvalue;
}
}

下面是使用共享内存的矩阵乘法:

__global__
void MatrixMulKernel(float* d_M, float* d_N, float* d_P, int Width)
{
__shared__ float Mds[blockWidth][blockWidth];
__shared__ float Nds[blockWidth][blockWidth];
int tx = threadIdx.x; int ty = threadIdx.y;
int bx = blockIdx.x; int by = blockIdx.y;

int row = by * blockWidth + ty;
int col = bx * blockWidth + tx;
float pvalue = 0;

for (int m = 0; m < Width / blockWidth; ++m)
{
    Mds[ty][tx] = d_M[row * Width + m*blockWidth + tx];
    Nds[ty][tx] = d_N[(m*blockWidth + ty)*Width + col];
    __syncthreads();
    for (int k = 0; k < blockWidth; ++k)
    {
        pvalue += Mds[ty][k]*Nds[k][tx];
    }
    __syncthreads();
}
d_P[row*Width + col] = pvalue;
}

据我所知,使用共享内存应该更快但是在比较这两个代码时,我发现没有共享内存的代码对于1600 * 1600矩阵运行速度大约快2秒。这个速度差异有什么解释或者我的代码出了什么问题吗?

我的老师使用&#34;编程大规模并行处理器&#34;预订为主要文本资源,这两个代码来自。

编辑:

内核配置:

int NumBlocks =ceil( Width / blockWidth);  // blockWidth = 16
dim3 dimGrid(NumBlocks, NumBlocks,1); // Width = 1600
dim3 dimBlock(blockWidth, blockWidth,1);
clock_t startGpuCalculation = clock();
MatrixMulKernel <<<dimGrid, dimBlock >>>(d_M, d_N, d_P, Width);
cudaThreadSynchronize();
clock_t endGpuCalculation = clock();

1 个答案:

答案 0 :(得分:2)

我在调试模式下运行项目(VS 2017&amp; CUDA 9)。我在发布模式下运行代码,共享内存比全局内存快得多。我的错。