Я пытаюсь сделать очень простую программу, чтобы выполнить добавление матриц. Я разделил код на два файла, файл main.cu и файл header.cuh. Код:Программа Cuda для добавления матрицы
В main.cu:
#include <iostream>
#include <cuda.h>
#include "Matriz.cuh"
using std:: cout;
int main(void)
{
Matriz A;
Matriz B;
Matriz *C = new Matriz;
int lin = 10;
int col = 10;
A.lin = lin;
A.col = col;
B.lin = lin;
B.col = col;
C->lin = lin;
C->col = col;
C->matriz = new double[lin*col];
A.matriz = new double[lin*col];
B.matriz = new double[lin*col];
for (int ii = 0; ii < lin; ii++)
for (int jj = 0; jj < col; jj++)
{
A.matriz[jj*A.lin + ii] = 1./(float)(10.*jj + ii + 10.0);
B.matriz[jj*B.lin + ii] = (float)(jj + ii + 1);
}
somaMatriz(A, B, C);
for (int ii = 0; ii < lin; ii++)
{
for (int jj = 0; jj < col; jj++)
cout << C->matriz[jj*C->lin + jj] << " ";
cout << "\n";
}
return 0;
}
В matrix.cuh:
#include <cuda.h>
#include <iostream>
using std::cout;
#ifndef MATRIZ_CUH_
#define MATRIZ_CUH_
typedef struct{
double *matriz;
int lin;
int col;
} Matriz;
__global__ void addMatrix(const Matriz A, const Matriz B, Matriz C)
{
int idx = threadIdx.x + blockDim.x*gridDim.x;
int idy = threadIdx.y + blockDim.y*gridDim.y;
C.matriz[C.lin*idy + idx] = A.matriz[A.lin*idx + idy] + B.matriz[B.lin*idx + idy];
}
void somaMatriz(const Matriz A, const Matriz B, Matriz *C)
{
Matriz dA;
Matriz dB;
Matriz dC;
int BLOCK_SIZE = A.lin;
dA.lin = A.lin;
dA.col = A.col;
dB.lin = B.lin;
dB.col = B.col;
dC.lin = C->lin;
dC.col = C->col;
cudaMalloc((void**)&dA.matriz, dA.lin*dA.col*sizeof(double));
cudaMalloc((void**)&dB.matriz, dB.lin*dB.col*sizeof(double));
cudaMalloc((void**)&dC.matriz, dC.lin*dC.col*sizeof(double));
cudaMemcpy(dA.matriz, A.matriz, dA.lin*dA.col*sizeof(double), cudaMemcpyHostToDevice);
cudaMemcpy(dB.matriz, B.matriz, dB.lin*dB.col*sizeof(double), cudaMemcpyHostToDevice);
dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
dim3 dimGrid(dA.lin/dimBlock.x, dA.col/dimBlock.y);
addMatrix<<<dimGrid, dimBlock>>>(dA, dB, dC);
cudaMemcpy(C->matriz, dC.matriz, dC.lin*dC.col*sizeof(double), cudaMemcpyDeviceToHost);
cudaFree(dA.matriz);
cudaFree(dB.matriz);
cudaFree(dC.matriz);
return;
}
#endif /* MATRIZ_CUH_ */
Что я получаю: Матрица C заполняется из них, независимо от того, что я делаю , Я использую эту программу, чтобы получить представление о том, как работать с матрицами с переменным размером в программе GPU. Что не так с моим кодом?
В печати C у вас есть 'cout << C-> matriz [jj * C-> lin + jj] <<" ";' (оба jj) возможно хотели 'cout << C-> matriz [jj * C-> lin + ii] << "" и в 'addMatrix' для A и B у вас есть' lin * idx', а C имеет 'lin * idy', но я подозреваю, что они должны быть одинаковыми. – ryanpattison
Хорошо ...Я изменил эти строки, но я все еще получаю некоторые странные результаты: я пытаюсь использовать матрицы 10x10, а результирующая C - это полная матрица, за исключением двух последних строк и двух столбцов, где она приводит к подматрице реального числа 2x2. – Gabs