Перемножение матриц на cuda
#include <stdio.h>
#include "check_error.h"
__global__ void multiplic(float *a, int a_row, float *b, int b_col, float *c) {
int a_col = threadIdx.x + blockIdx.x * blockDim.x;
int b_row = threadIdx.y + blockIdx.y * blockDim.y;
if(a_row == b_col) {
float sum = 0;
for(int i = 0; i < a_row; i++) {
sum += a[a_col * blockDim.y * gridDim.y + i] * b[i * blockDim.x * gridDim.x + b_row];
}
c[a_col * blockDim.y * gridDim.y + b_row] = sum;
}
}
int main() {
int MatrixSecEL = 3;
int MatrixX = 3;
int MatrixY = 4;
float *a = (float *) malloc(MatrixX * MatrixSecEL * sizeof(float));
float *b = (float *) malloc(MatrixY * MatrixSecEL * sizeof(float));
float *c = (float *) malloc(MatrixX * MatrixY * sizeof(float));
for (int i = 0; i < MatrixX * MatrixSecEL; i++) {
if((i + 1) % 2)
a[i] = 3;
else
a[i] = 2;
}
printf("Фильтор 1\n");
for (int i = 0; i < MatrixX * MatrixSecEL; i++) {
if((i + 1) % MatrixSecEL) {
printf("%f ", a[i]);
}
else {
printf("%f\n", a[i]);
}
}
for (int i = 0; i < MatrixY * MatrixSecEL; i++) {
b[i] = 1;
}
printf("Фильтор 2\n");
for (int i = 0; i < MatrixY * MatrixSecEL; i++) {
if((i + 1) % MatrixY) {
printf("%f ", b[i]);
}
else {
printf("%f\n", b[i]);
}
}
float *dev_a, *dev_b, *dev_c;
HANDLE_ERROR(cudaMalloc((void **) &dev_a, MatrixX * MatrixSecEL * sizeof(float)));
HANDLE_ERROR(cudaMalloc((void **) &dev_b, MatrixY * MatrixSecEL * sizeof(float)));
HANDLE_ERROR(cudaMalloc((void **) &dev_c, MatrixX * MatrixY * sizeof(float)));
HANDLE_ERROR(cudaMemcpy(dev_a, a, MatrixX * MatrixSecEL * sizeof(float), cudaMemcpyHostToDevice));
HANDLE_ERROR(cudaMemcpy(dev_b, b, MatrixY * MatrixSecEL * sizeof(float), cudaMemcpyHostToDevice));
dim3 threads(MatrixX, MatrixY);
//dim3 threads(MatrixY, MatrixX);
multiplic<<<1, threads>>>(dev_a, MatrixSecEL, dev_b, MatrixSecEL, dev_c);
HANDLE_ERROR(cudaMemcpy(c, dev_c, MatrixX * MatrixY * sizeof(float), cudaMemcpyDeviceToHost));
printf("Выхлоп\n");
for (int i = 0; i < MatrixX * MatrixY; i++) {
if((i + 1) % MatrixY) {
printf("%f ", c[i]);
}
else {
printf("%f\n", c[i]);
}
}
printf("\n");
for (int i = 0; i < MatrixX * MatrixY; i++) {
printf("%f ", c[i]);
}
printf("\n");
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
free(a);
free(b);
free(c);
return 0;
}
Я написал код перемножния матриц, ну вот уже 2 день не понимаю, почему он не работает?
Выхлоп a.out
Фильтор 1
3.000000 2.000000 3.000000
2.000000 3.000000 2.000000
3.000000 2.000000 3.000000
Фильтор 2
1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000
Выхлоп
8.000000 8.000000 8.000000 8.000000
8.000000 8.000000 8.000000 8.000000
3.000000 3.000000 3.000000 3.000000
8.000000 8.000000 8.000000 8.000000 8.000000 8.000000 8.000000 8.000000 3.000000 3.000000 3.000000 3.000000