【发布时间】:2012-04-12 22:23:53
【问题描述】:
问题:
我有 4 个单精度数字矩阵 (64x64)。需要进行如下计算:
R = A * sin(B) + C * cos(D)
想法:
为了加快计算使用共享内存。因为每个线程块(在我的 GPU 的情况下)有 16KB 共享内存并且浮点数为 4,所以可以在共享内存中存储 4000 个浮点数。所以对于每个矩阵使用 1000 个元素,即每个维度 31 个元素。
所以每个矩阵应该被分成16个子矩阵(16x16)。
dim3 dimBlock(16, 16, 1)
dim3 dimGrid(4, 4, 1)
内核:
int Tx = threadIdx.x;
int Ty = threadIdx.y;
int Bx = blockIdx.x;
int By = blockIdx.y;
int idx = Bx * blockDim.x + Tx;
int idy = By * blockDim.y + Ty;
__shared__ float s_A[16*16];
__shared__ float s_B[16*16];
__shared__ float s_C[16*16];
__shared__ float s_D[16*16];
// I am not sure how to write this part
s_A[(Tx * blockDim.x + Ty + By) + Bx] = A[idx * 64 + idy];
s_B[(Tx * blockDim.x + Ty + By) + Bx] = B[idx * 64 + idy];
s_C[(Tx * blockDim.x + Ty + By) + Bx] = C[idx * 64 + idy];
s_D[(Tx * blockDim.x + Ty + By) + Bx] = D[idx * 64 + idy];
R[idx * 64 + idy] = s_A[(Tx * blockDim.x + Ty + By) + Bx] * sin(s_B[(Tx * blockDim.x + Ty + By) + Bx]) + s_C[(Tx * blockDim.x + Ty + By) + Bx] * cos(s_D[(Tx * blockDim.x + Ty + By) + Bx]);
如何将原始矩阵划分为子矩阵,以便每个块都有自己的 4 个子矩阵并对其进行计算。
【问题讨论】:
-
cos(D)是指D的矩阵余弦,还是D的所有元素的余弦?这两件事非常不同。 -
sry,所有元素 D 的余弦