我需要完成一个非方阵矩阵乘法程序的某些部分,这与我的GPU编程课有关。具体来说,是内核函数和初始化线程块和内核网格的维度。
我参考了CUDA C编程指南中的矩阵乘法代码,但是我修改了我的代码,仅使用给定的参数(因为我们不允许更改参数),而不是像他们一样使用结构体。我们提供了3个矩阵A、B和C,以及它们的维度-m x k、k x n和m x n。在使用结构体时,A.height对应维度m,B.width对应维度n等。
我遇到了几个问题,首先是我的程序未通过包含的测试,该测试验证了乘积矩阵C的正确性。我认为我的矩阵乘法代码存在问题,问题可能出现在我对结构体代码进行修改。
#include <stdio.h>
__global__ void mysgemm(int m, int n, int k, const float *A, const float *B,
float* C) {
/********************************************************************
*
* Compute C = A x B
* where A is a (m x k) matrix
* where B is a (k x n) matrix
* where C is a (m x n) matrix
*
********************************************************************/
// INSERT KERNEL CODE HERE
// Each thread computes one element of C
// by accumulating results into Cvalue
float Cvalue = 0;
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
for (int e = 0; e < k; ++e){
Cvalue += (A[row * k + e]) * (B[e * n + col]);
}
C[row * n + col] = Cvalue;
}
我另一个问题,我甚至不太确定的是,涉及到初始化线程块和内核网格维度的代码。
// Initialize thread block and kernel grid dimensions ---------------------
const unsigned int BLOCK_SIZE = 16; // Use 16x16 thread blocks
//INSERT CODE HERE
dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
dim3 dimGrid(n / dimBlock.x, m / dimBlock.y);
// Invoke CUDA kernel -----------------------------------------------------
//INSERT CODE HERE
mysgemm<<<dimGrid, dimBlock>>>(m, n, k, A, B, C);
我理解dimBlock,但我不理解dimGrid,也不知道应该使用什么参数。当我按照原样运行代码时,如果我传递给它的矩阵没有2的幂次维度,内核甚至都不会启动。而如果我使用2的幂,则测试仍然失败。
我很抱歉如果我说得过多了。这是我的第一篇文章,我希望尽可能提供更多的细节。希望有人可以帮忙解决这些问题。