1

行列操作用の次のカーネル コードがあります。行列 A = 1*3 および行列 B = 3*3 の結果、行列 C は 1*3 になります。次のコードでは、幅は 3 になります。

__global__void MatrixMulKernel(float* d_M,float* d_N,float* 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){  // matrix range
      return;
    }
   float P_val = 0.0f;
   for (int k = 0; k < Width; ++k) {
   float M_elem = d_M[row * Width + k];
   float N_elem = d_N[k * Width + col];
   P_val += M_elem * N_elem;
  }
 d_p[row*Width+col] = P_val;
}

Iカーネルコードは次のように呼び出されます

int block_size = 32;
dim3 dimGrid(Width/block_size, Width/block_size);
dim3 dimBlock(block_size, block size);
MatrixMulKernel<<<dimGrid, dimBlock>>>(d_M, d_N, d_P,3);

しかし、私は間違った結果を得ています。私は常にゼロとして結果を得ています。誰でも私を助けてください。

4

1 に答える 1

3

このコードは、同じサイズの2つの正方行列の乗算に似ています。

幅は、最初の行列の列数です。

これを関数の引数として指定する必要があります。

于 2012-05-15T06:46:50.507 に答える