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

纳赛尔·库尔德(Nasser Kurd)

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

__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秒。对于这种速度差异是否有任何解释,或者我的代码出了点问题?

我的老师使用“大规模并行处理器编程”这本书作为主要文本资源,这两个代码是从那本书中获得的。

编辑:

内核配置:

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();
纳赛尔·库尔德(Nasser Kurd)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

移动OpenCL本地存储库冲突。为什么使用本地内存比内核中的全局内存要慢?

矩阵乘法:在CUDA中合并全局内存访问后,性能下降

用CUDA中的全局内存初始化共享内存时出错

如何在CUDA中安全地将全局内存中的数据加载到共享内存中?

CUDA内核中的Heisenbug,全局内存访问

在CUDA中访问全局内存的速度很慢

CUDA中的静态分配的全局内存结构

CUDA 对全局内存的低效访问模式

矩阵向量乘积CUDA通过平铺和共享内存提高性能

OpenCL中的本地内存围栏和全局内存围栏有什么区别?

如何在CUDA中正确添加全局内存?

CUDA动态并行和全局内存同步

CUDA:使用多个线程访问全局内存

线程与全局内存的交互

全局内存分段错误

CUDA中的动态共享内存

为什么在做reduce时使用寄存器内存比共享内存慢?

如何找出GPU的共享内存和全局内存大小?

将数据从全局内存移动到共享内存是否会使线程停止?

矩阵乘法运算执行中的内存泄漏

为什么这种OpenCL算法中的本地内存这么慢?

为什么矩阵加法比本征矩阵向量乘法慢?

在cuda中,加载到共享内存比加载到寄存器慢

将线程本地内存刷新到全局内存是什么意思?

为什么DDR4内存中的内存时序比DDR3这么慢?

GTX Titan Z全局内存

CUDA 写入其他经线看不到的全局内存

OpenCL中工作项和全局内存之间的内存传输?

CUDA sprintf到全局/共享内存缓冲区