Hallo,
ich versuche mich gerade an der Cuda Programmierung unter linux.
Mein aktuelles beispiel soll 2 Matrizen Zusammen Addieren und in der Variable C speichern.
Anschließend soll es alles ausgeben. Leider Funktioniert es nich. Ich denke mal es ist ein Pointer Problem.
Ich hoffe ihr könnt mir helfen. Beim Debugen sagt er mir Segmantion faul bei der printf ausgabe von c.
Der Code funktioniert wenn man die array nicht dynamisch initialisiert. D.h. wenn ich gleich A[N][N]... schreibe. Ich will es aber dynamisch.
Vielen Dank im vorraus
ich versuche mich gerade an der Cuda Programmierung unter linux.
Mein aktuelles beispiel soll 2 Matrizen Zusammen Addieren und in der Variable C speichern.
Anschließend soll es alles ausgeben. Leider Funktioniert es nich. Ich denke mal es ist ein Pointer Problem.
Ich hoffe ihr könnt mir helfen. Beim Debugen sagt er mir Segmantion faul bei der printf ausgabe von c.
Der Code funktioniert wenn man die array nicht dynamisch initialisiert. D.h. wenn ich gleich A[N][N]... schreibe. Ich will es aber dynamisch.
Code:
#include <cuda.h>
#include <stdio.h>
#include <stdlib.h>
#define N 5
#define BLOCK_DIM 5
__global__ void matrixAdd (int *a, int *b, int *c);
void InitData(int** data, int n);
void RandomInit(int** data, int n);
int main()
{
int** a;
int** b;
int** c;
int* dev_a;
int* dev_b;
int* dev_c;
int size = N * N * sizeof(int);
// initialize a and b with real values (NOT SHOWN)
cudaMalloc((void**)&dev_a, size);
cudaMalloc((void**)&dev_b, size);
cudaMalloc((void**)&dev_c, size);
a = (int**) malloc((N) * sizeof(int*));
InitData(a, N);
RandomInit(a, N);
/*-------------------------------------------------------------------------*/
b = (int**) malloc((N) * sizeof(int*));
InitData(b, N);
RandomInit(b, N);
/*------------------------------------------------------------------------*/
c = (int**) malloc((N) * sizeof(int*));
InitData(c, N);
cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, size, cudaMemcpyHostToDevice);
dim3 dimBlock(BLOCK_DIM, BLOCK_DIM);
dim3 dimGrid((int)ceil(N/dimBlock.x),(int)ceil(N/dimBlock.y));
matrixAdd<<<dimGrid,dimBlock>>>(dev_a,dev_b,dev_c);
cudaThreadSynchronize();
cudaMemcpy(a, dev_a, size, cudaMemcpyDeviceToHost);
cudaMemcpy(b, dev_b, size, cudaMemcpyDeviceToHost);
cudaMemcpy(c, dev_c, size, cudaMemcpyDeviceToHost);
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
printf("%i + %i \n", a[i][j],b[i][j]);
}
}
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
printf("%i \n", c[i][j]);
}
}
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
free(a);
free(b);
free(c);
}
/*******************************************************************************
*******************************************************************************/
__global__ void matrixAdd (int *a, int *b, int *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[index] = a[index] + b[index];
}
}
/*******************************************************************************
*******************************************************************************/
void RandomInit(int** data, int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
data[i][j] = rand()%(int)100;
}
}
}
/*******************************************************************************
*******************************************************************************/
void InitData(int** data, int n)
{
for (int i = 0; i < N; ++i)
{
data[i] = (int*) malloc((N) * sizeof(int));
if (data[i] == NULL)
{
printf("ERROR(%s, %d): Speicher konnte nicht alloziiert werden.\n",
__FILE__, __LINE__);
}
}
}
Vielen Dank im vorraus