Hallo,
ich würde gerne bei meinem Cuda Projekt structuren verwenden bei der Matrixaddition.
Leider funktioniert das nicht. Kann einer helfen? Ich denke mal das der Fehler bei cudaMemcpy liegt oder generell mit den Pointern.
Main.c
Main funktioniert.
ich denke in der.cu datei ist der fehler.
kernel aufruf der auch angepasst werden muss wegen den Pointern denk ich mal.
hoffe einer kann mir helfen.
ich würde gerne bei meinem Cuda Projekt structuren verwenden bei der Matrixaddition.
Leider funktioniert das nicht. Kann einer helfen? Ich denke mal das der Fehler bei cudaMemcpy liegt oder generell mit den Pointern.
Main.c
Code:
/*******************************************************************************
*******************************************************************************/
int main()
{
/*---------------------------------------------------------------------------
* Host variables have the prefix h.
* Device variables have the prefix d.
--------------------------------------------------------------------------*/
MATRIX* h_a;
MATRIX* h_b;
MATRIX* h_c;
int i, j;
/*---------------------------------------------------------------------------
* Initial 2 Dim array with random values.
--------------------------------------------------------------------------*/
h_a = (MATRIX*) malloc(sizeof(MATRIX));
h_a->width = 4;
h_a->height = 4;
h_a->elements = (int*) malloc(h_a->width * h_a->height * sizeof(int));
RandomInit(&h_a);
/*---------------------------------------------------------------------------*/
h_b = (MATRIX*) malloc(sizeof(MATRIX));
h_b->width = 4;
h_b->height = 4;
h_b->elements = (int*) malloc(h_b->width * h_b->height * sizeof(int));
RandomInit(&h_b);
/*-------------------------------------------------------------------------*/
h_c = (MATRIX*) malloc(sizeof(MATRIX));
h_c->width = 4;
h_c->height = 4;
h_c->elements = (int*) malloc(h_c->width * h_c->height * sizeof(int));
matrixAdd(h_a, h_b, h_c);
printMatResult(h_a);
printf(" +\n");
printMatResult(h_b);
printf("============================\n");
printMatResult(h_c);
DeleteMat(h_a);
DeleteMat(h_b);
DeleteMat(h_c);
return 0;
}
Main funktioniert.
ich denke in der.cu datei ist der fehler.
Code:
extern "C" int matrixAdd(const MATRIX* A, const MATRIX* B, MATRIX* C)
{
/*---------------------------------------------------------------------------
* Device variables have the prefix d.
--------------------------------------------------------------------------*/
MATRIX* d_A;
int size_a = A->height * A->width * sizeof(int);
/*-------------------------------------------------------------------------*/
MATRIX* d_B;
int size_b = B->height * B->width * sizeof(int);
/*-------------------------------------------------------------------------*/
MATRIX* d_C;
int size_c = C->height * C->width * sizeof(int);
/*---------------------------------------------------------------------------
* initialize a, b and c on the device (NOT SHOWN).
--------------------------------------------------------------------------*/
cudaMalloc((void**)&d_A, size_a);
cudaMalloc((void**)&d_B, size_b);
cudaMalloc((void**)&d_C, size_c);
cudaMemcpy(d_A, A, size_a, cudaMemcpyHostToDevice);
cudaMemcpy(d_B, B, size_b, cudaMemcpyHostToDevice);
cudaMemcpy(d_C, C, size_c, cudaMemcpyHostToDevice);
dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
dim3 dimGrid(B->height / dimBlock.x, A->width / dimBlock.y);
// kernel
matrixAddKernel<<<dimGrid,dimBlock>>>(d_A, d_B, d_C);
cudaThreadSynchronize();
// find a error
check_cuda_errors(__FILE__, __LINE__);
// Read C from device memory
cudaMemcpy(C, d_C, size_c, cudaMemcpyDeviceToHost);
// Free device memory
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
return 0;
}
kernel aufruf der auch angepasst werden muss wegen den Pointern denk ich mal.
Code:
/*******************************************************************************
*******************************************************************************/
__global__ void matrixAddKernel(const MATRIX* A, const MATRIX* B, MATRIX* C)
{
int col = blockIdx.x * blockDim.x + threadIdx.x;
int row = blockIdx.y * blockDim.y + threadIdx.y;
int index = col * N + row;
if (col < N && row < N)
{
C->elements[index] = A->elements[index] + B->elements[index];
}
}
hoffe einer kann mir helfen.