【发布时间】:2012-12-14 04:09:18
【问题描述】:
我正在尝试实现一个基于共享内存的矩阵乘法内核,如 CUDA C 编程指南中所述。以下是内核:
__global__ void matrixMultiplyShared(float * A, float * B, float * C,
int ARows, int AColumns,
int BRows, int BColumns,
int CRows, int CColumns) {
float * CSub = &C[CColumns * 16 * blockIdx.y + 16 * blockIdx.x];
float CValue = 0;
for (int k = 0; k < (AColumns / 16); ++k) {
float * ASub = &A[AColumns * 16 * blockIdx.y + 16 * k];
float * BSub = &B[AColumns*16*k + 16*blockIdx.y];
__shared__ float As[16][16];
__shared__ float Bs[16][16];
As[threadIdx.y][threadIdx.x] = ASub[threadIdx.y*AColumns+threadIdx.x];
Bs[threadIdx.y][threadIdx.x] = BSub[threadIdx.y*AColumns+threadIdx.x];
__syncthreads();
for (int n = 0; n < 16; ++n)
CValue += As[threadIdx.y][n] * Bs[n][threadIdx.x];
__syncthreads();
}
CSub[threadIdx.x*CColumns+threadIdx.y]=CValue;
}
虽然下面是对内核的调用:
dim3 dimBlock(16, 16, 1);
dim3 dimGrid;
dimGrid.x = (CColumns + dimBlock.x - 1)/dimBlock.x;
dimGrid.y = (CRows + dimBlock.y - 1)/dimBlock.y;
matrixMultiplyShared<<<dimGrid , dimBlock>>>(deviceA , deviceB , deviceC , ARows , AColumns, BRows ,BColumns , CRows , CColumns);
不幸的是,这似乎产生了不正确的结果。
任何帮助/解释将不胜感激。
【问题讨论】:
-
如果你删除所有 16 是否有效(将所有这 16 变成一个命名常量 - 这样,你很容易将其更改为 1,如果你想检查是否使用 16、32、64、128 或其他更快)
-
为什么要使用浮点数初始化块尺寸?它是一个整数结构。在这种情况下 16 完全可以表示为浮点数,但在其他情况下你就不会那么幸运了
-
将其固定为整数,尝试将其移动到命名常量中 - 无效。
-
您是否尝试使用
(1,1,1)的网格维度将两个矩阵相乘? -
我猜很多人都在上同一门课。看看this question。
标签: c cuda parallel-processing gpu shared-memory