Man möge mir den Doppelpost verzeihen.
Ich habe deine Lösung. Das Problem liegt in den (cuda)memcpy-Zeilen. Dort kopierst du int** nach int* und int* nach int**. Das geht so nicht.
Einige Dinge habe ich jetzt nicht berücksichtigt, aber das Optimieren überlasse ich mal dir
Gruss
cwriter
Ich habe deine Lösung. Das Problem liegt in den (cuda)memcpy-Zeilen. Dort kopierst du int** nach int* und int* nach int**. Das geht so nicht.
C:
#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);
for(int i = 0;i<N;i++)
{
cudaMemcpy(dev_a +(i*N), a[i], N*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b +(i*N), b[i], N*sizeof(int), 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();
for(int i = 0;i<N;i++)
{
cudaMemcpy(c[i], dev_c +(i*N), N*sizeof(int), 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__);
}
}
}
Einige Dinge habe ich jetzt nicht berücksichtigt, aber das Optimieren überlasse ich mal dir
Gruss
cwriter
Zuletzt bearbeitet: