Ну, есть несколько проблем с вашим кодом.Посмотрите на комментарии в коде ниже.
В размере массива вы должны использовать sizeof(u_int32_t)
, а не тип указателя.Трудно найти ошибки, потому что размер двух типов может быть случайно одинаковым на некоторых платформах, но не на других.
size_t arr_size = (block_size*grid_size) * sizeof(u_int32_t);
// host array wasn't allocated at all.
host_fb = malloc(arr_size);
cudaMalloc((void **)&device_fb, arr_size);
// the loop is unnecessary, you have now an allocated 2D table
cudaMemcpy(device_fb, host_fb, (block_size*grid_size)*sizeof(u_int32_t*), cudaMemcpyHostToDevice);
Я использовал функцию malloc
, потому что cudaMallocHost
и cudaHostAlloc
оба выделяют заблокированную страницу хост-памяти, доступной для устройства, что, вероятно, не то, что вам здесь нужно.Вы можете использовать их, если есть проблема с производительностью, так как они заставляют выделенную память быть выгруженной.Подробности см. В соответствующих документах.