gpt4 book ai didi

c++ - 为什么 CUDA 共享内存在分块矩阵乘法中比全局内存慢?

转载 作者:行者123 更新时间:2023-11-30 03:27:06 25 4
gpt4 key购买 nike

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

__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 秒。对这种速度差异有任何解释或我的代码有问题吗?

我的老师使用“Programming Massively Parallel Processors”这本书作为主要文本资源,这两个代码来自那本书。

编辑:

内核配置:

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();

最佳答案

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

关于c++ - 为什么 CUDA 共享内存在分块矩阵乘法中比全局内存慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47637048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com