Что-то не так с распределением памяти или memcpy?
Да, по обоим пунктам.
Это:
cudaMalloc((void***)&d_a, N*sizeof(int*));
for (int i =0; i < N; i++){
cudaMalloc((void**)&d_a,N*sizeof(int));
}
должно быть сделано так:
cudaMalloc((void***)&d_a, N*sizeof(int*));
for (int i=0; i < N; i++){
int *row;
cudaMalloc((void**)&row, N*sizeof(int));
cudaMemcpy(d_a+i, &row, sizeof(int*), cudaMemcpyHostToDevice);
}
А потом вот это:
create <<<1, N>>>(d_a);
errorCheck();
cudaMemcpy(a, d_a, (N*N)*sizeof(int),cudaMemcpyDeviceToHost);
должно быть сделано так:
create <<<1, dim3(N,N)>>>(d_a);
errorCheck();
for(int i=0; i<N; i++) {
int* row;
cudaMemcpy(&row, d_a+i, sizeof(int*), cudaMemcpyDeviceToHost);
cudaMemcpy(a[i], row, sizeof(int) * N, cudaMemcpyDeviceToHost);
}
[Весь код написан в браузере и не проверен, используйте на свой страх и риск]
Короче говоря, вы решили работать с массивом указателей. Это требует дополнительных операций API CUDA, потому что указатели строк в копии GPU не доступны на хосте при стандартном назначении. Вы должны использовать cudaMemcpy
в каждом случае.