对于我的GPU编程类,我们的任务是完成非方形矩阵乘法程序的某些部分。具体来说,内核函数和初始化线程块和内核网格维度。CUDA中的非方形矩阵乘法
我已经将我的代码基于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的幂,则测试仍然失败。
我道歉,如果我太罗嗦了。这是我的第一篇文章,我想给尽可能多的细节。希望有人能帮助我解决这些问题。
关于cuda矩阵乘法有很多问题,几乎考虑了所有可能的变体。像[这一个]例如(http://stackoverflow.com/questions/18815489/cuda-tiled-matrix-matrix-multiplication-with-shared-memory-and-matrix-size-whic)。也许你应该回顾一些已经被要求提出想法/提示/线索的问题。 –