對於我的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)。也許你應該回顧一些已經被要求提出想法/提示/線索的問題。 –