Ошибка cudaMalloc для двумерного массива, код ошибки 11 - PullRequest
2 голосов
/ 11 ноября 2011

Я пытаюсь реализовать 2D-массив в CUDA следующим образом:

u_int32_t **device_fb = 0;
u_int32_t **host_fb = 0;

cudaMalloc((void **)&device_fb, (block_size*grid_size)*sizeof(u_int32_t*));

for(int i=0; i<(block_size*grid_size); i++)
{
    cudaMalloc((void **)&host_fb[i], numOpsPerCore*sizeof(u_int32_t));
}
cudaMemcpy(device_fb, host_fb, (block_size*grid_size)*sizeof(u_int32_t*), cudaMemcpyHostToDevice);

При тестировании host_fb равно NULL. Кроме того, когда я получаю код ошибки для первой итерации cudaMalloc((void **)&host_fb[i], numOpsPerCore*sizeof(u_int32_t));, я получаю cudaErrorInvalidValue. Что я делаю неправильно? Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 ноября 2011

Ну, есть несколько проблем с вашим кодом.Посмотрите на комментарии в коде ниже.

В размере массива вы должны использовать 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 оба выделяют заблокированную страницу хост-памяти, доступной для устройства, что, вероятно, не то, что вам здесь нужно.Вы можете использовать их, если есть проблема с производительностью, так как они заставляют выделенную память быть выгруженной.Подробности см. В соответствующих документах.

0 голосов
/ 11 ноября 2011

С двумерными массивами на графическом процессоре сложно манипулировать, необходимо учитывать, что адресное пространство графического процессора и процессора несовместимо. Позвольте мне отметить несколько наблюдений:

1) Вы не инициализируете массив ** host_fb, поэтому последующие вызовы элементов этого массива в цикле for ошибочны.

2) Вы должны использовать cudaMallocHost (или что-то подобное) для выделения памяти, к которой будет обращаться ЦП

Кроме этого, я не могу вам помочь, так как вы не сказали нам, что должен делать код.

...