Jestem pod wrażeniem mnożenia macierzy na CUDA. Wynikowa macierz produktu ma zawsze wartość zero. Przeczytałem kilka przykładowych kodów, takich jak matrix multiplication in cuda, aby rozwiązać mój problem, ale wszystko na próżno.Mnożenie macierzy za pomocą CUDA
Poza błędnym wynikiem 0, maksymalny rozmiar "Szerokość" (kod poniżej) wynosi nawet 512. Nie byłem w stanie debugować, gdzie leży problem. Możemy to omówić na StackOverflow.
mam na myśli „Programowanie procesorów masowo równoległych”
#include<cuda.h>
#include<stdio.h>
int main(void) {
void MatrixMultiplication(float *, float *, float *, int);
const int Width = 5;
float M[Width*Width], N[Width*Width], P[Width*Width];
for(int i = 0; i < (Width*Width) ; i++) {
M[i] = 5;
N[i] = 5;
P[i] = 0;
}
MatrixMultiplication(M, N, P, Width);
for(int i = 0; i < (Width*Width) ; i++) {
printf("%d \n", P[i]);
}
int quit;
scanf("%d",&quit);
return 0;
}
//Matrix multiplication kernel - thread specification
__global__ void MatrixMulKernel(float *Md, float *Nd, float *Pd, int Width) {
//2D Thread ID
int tx = threadIdx.x;
int ty = threadIdx.y;
//Pvalue stores the Pd element that is computed by the thread
float Pvalue = 0;
for(int k = 0; k < Width ; ++k) {
float Mdelement = Md[ty*Width + k];
float Ndelement = Nd[k*Width + tx];
Pvalue += (Mdelement*Ndelement);
}
Pd[ty*Width + tx] = Pvalue;
}
void MatrixMultiplication(float *M, float *N, float *P, int Width) {
int size = Width*Width*sizeof(float);
float *Md, *Nd, *Pd;
//Transfer M and N to device memory
cudaMalloc((void**)&Md, size);
cudaMemcpy(Md,M,size,cudaMemcpyHostToDevice);
cudaMalloc((void**)&Nd, size);
cudaMemcpy(Nd,N,size,cudaMemcpyHostToDevice);
//Allocate P on the device
cudaMalloc((void**)&Pd,size);
//Setup the execution configuration
dim3 dimBlock(Width,Width);
dim3 dimGrid(1,1);
//Launch the device computation threads!
MatrixMulKernel<<<dimGrid,dimBlock>>>(Md,Nd,Pd,Width);
//Transfer P from device to host
cudaMemcpy(P,Pd,size,cudaMemcpyDeviceToHost);
//Free device matrices
cudaFree(Md);
cudaFree(Nd);
cudaFree(Pd);
}
Aby uzyskać prawidłowe formatowanie kodu, musisz wcięcie całego kodu z 4 spacji. Możesz to łatwo zrobić podświetlając swój kod i naciskając 'Ctrl + K'. –
Dzięki Jeff! Zamierzał to zrobić –
Jeśli nie musisz trzymać się własnego kodu, CUDA C Programming Guide ma wspaniałą implementację matrix-mul, która może obsługiwać matryce o innych wymiarach niż moce dwóch i jest zoptymalizowana przy użyciu pamięci współużytkowanej. Gorąco polecam go do użytku w świecie rzeczywistym i do nauki. –