簡體   English   中英

使用 CUDA 的矩陣乘法:錯誤的輸出

[英]Matrix multiplication using CUDA:Wrong output

我是CUDA的初學者。 我正在編寫一個程序來在不使用共享內存的情況下將兩個矩陣相乘。 這是我的程序,我將填充1 4x4 矩陣相乘。

輸出是26853932 ,其中正確的輸出應該是4

有人可以告訴我我錯在哪里。 也許我犯了一個非常幼稚的錯誤?

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include<stdlib.h>  

//kernel deifnition

__global__ void mulKernel(int *d_M,  int *d_N,  int *d_P,int width)
{
int row = blockIdx.y*blockDim.y + threadIdx.y;
int col = blockIdx.x*blockDim.x + threadIdx.x;


if (row < width && col < width)
{
    int pvalue=0;
    for (int k = 0; k < width; k++)
    {
        pvalue = pvalue + (d_M[row*width + k] * d_N[k*width + col]);
    }

    d_P[row*width + col] = pvalue;
}
}

int main()
{
const int block_size = 2;
const int array_width = 4;
int h_M[array_width][array_width] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

int h_N[array_width][array_width] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int h_P[array_width][array_width];

int size = array_width*array_width*(sizeof(int));
int *d_M, *d_N, *d_P;

//memory allocation
cudaMalloc((void**)&d_M, size);
cudaMalloc((void**)&d_N, size);
cudaMalloc((void**)&d_P, size); 

//copy data from host to memory
cudaMemcpy(d_M, h_M, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_N, h_N, size, cudaMemcpyHostToDevice);

dim3 grid(array_width/block_size, array_width/block_size, 0);       //grid size
dim3 block(block_size, block_size, 0);  //block size

mulKernel << <grid, block >> >(d_M,d_N,d_P,array_width);

cudaMemcpy(h_P, d_P, size, cudaMemcpyDeviceToHost);

printf("%d", h_P[0][0]);

printf("Press enter to exit....\n");
getchar();


}

問題出在線路上

dim3 grid(array_width/block_size, array_width/block_size, 0);       //grid size
dim3 block(block_size, block_size, 0);  //block size

其中 z 方向的網格范圍設置為 0。 3D 網格中 2D 對象的正確表示是將方向之一的范圍設置為 1。

該代碼在用1替換0或省略第三個參數后起作用(然后它默認初始化為1 ):

dim3 grid(array_width/block_size, array_width/block_size );
dim3 block(block_size, block_size );

如果設置不正確,內核調用會拋出運行時錯誤invalid configuration argument 您可以通過使用適當的 CUDA 錯誤檢查(或使用cuda-memcheck運行您的程序)輕松地發現自己。

GRID & BLOCK配置的初始化錯誤。

現在:

dim3 grid(array_width/block_size, array_width/block_size, 0);       //grid size
dim3 block(block_size, block_size, 0);  //block size

預期的:

dim3 grid(array_width/block_size, array_width/block_size, 1);       //grid size
dim3 block(block_size, block_size, 1);  //block size

使用 CUDA 錯誤語句是個好習慣。 以下是一個非常簡單的示例,只需將stmt替換為您期望的代碼 Statement 即可。

#define wbCheck(stmt) do{
cudaError_t err = stmt;
if (err != cudaSuccess) {
printf( "Failed to run stmt %d ", __LINE__);
printf( "Got CUDA error ...  %s ", cudaGetErrorString(err));
return -1;
}
} while(0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM