我从GPU编程开始,试图实现一个简单的矩阵乘法,但是它失败了,该程序返回一个由0表示的6矩阵。有人可以指出我失败的地方。
非常感谢。
#include <stdio.h>
#include <stdlib.h>
// Kernel
const int blocksize = 1;
__global__ void matrixMulti(float *A, float *B, float *C, int N){
// Threads
int ROW = blockIdx.y*blockDim.y + threadIdx.y;
int COL = blockIdx.x*blockDim.x + threadIdx.x;
// Temp value
float temp = 0;
if (COL < N && ROW < N){
for (int k = 0; k < N; k++){
temp += A[ROW*N + k]*B[k*N + COL];
}
C[ROW*3 + COL] = temp;
}
}
//Main function
int main(){
// Create matrix and initialize them
int K,M,N;
K = 3;
M = 3;
N = 3;
float A[M*K], B[K*N], C[M*N];
for (int i = 0; i < M*K; i++) {
A[i] = 1;
}
for (int i = 0; i < K*N; i++) {
B[i] = 2;
}
// Allocating Memory
const int aSize = M*K*sizeof(float);
const int bSize = K*N*sizeof(float);
const int cSize = M*N*sizeof(float);
float *matrixA, *matrixB, *matrixC;
cudaMalloc((void**)&matrixA, aSize);
cudaMalloc((void**)&matrixB, bSize);
cudaMalloc((void**)&matrixC, cSize);
//Fill memory
cudaMemcpy(matrixA, &A, aSize, cudaMemcpyHostToDevice);
cudaMemcpy(matrixB, &B, bSize, cudaMemcpyHostToDevice);
cudaMemcpy(matrixC, &C, cSize, cudaMemcpyHostToDevice);
printf("A[0] : %f \n",A[0]);
dim3 dimBlock(blocksize,blocksize);
dim3 dimGrid(3,3);
// Compute
matrixMulti<<<dimGrid, dimBlock>>>(matrixA, matrixB, matrixC, 3);
float* result;
result = (float *) malloc(9*sizeof(float));
cudaMemcpy(result, matrixC, cSize, cudaMemcpyDeviceToHost);
//printing results
printf("C[0] : %f \n",result[0]);
printf("C[1] : %f \n",result[1]);
printf("C[2] : %f \n",result[2]);
printf("C[3] : %f \n",result[3]);
printf("C[4] : %f \n",result[4]);
printf("C[5] : %f \n",result[5]);
printf("C[6] : %f \n",result[6]);
printf("C[7] : %f \n",result[7]);
printf("C[8] : %f \n",result[8]);
printf("C[9] : %f \n",result[9]);
// Release Memory
cudaFree(matrixA);
cudaFree(matrixB);
cudaFree(matrixC);
return EXIT_SUCCESS;
}
您的帖子似乎主要是代码;请添加一些详细信息,这就是为什么我在最后添加这些无用评论的原因,但是经过多次尝试,看来这是应有的。