Объявите и инициализируйте массив массивов в CUDA

Я пытаюсь объявить и инициализировать массив массивов в CUDA. Я использую следующий кусок кода:

int** h_array = (int**)malloc(num_of_arrays * sizeof(int*));
int** d_array;
cudaMallocHost((void**)&d_array, num_of_arrays * sizeof(int*));

for(size_t i = 0 ; i < num_of_arrays ; i++){
    cudaMallocHost(&h_array[i], array_size * sizeof(int));
}
for(size_t i = 0 ; i < num_of_arrays ; i++){
    cudaMemcpy(d_array[i], h_array[i], array_size * sizeof(int), cudaMemcpyHostToDevice);
}

int** h_array2 = (int**)malloc(num_of_arrays * sizeof(int*));

Обратите внимание, что h_array2 инициализируется правильно (это массив массивов, для которого каждый массив инициализируется правильно). Затем я пытаюсь сделать следующее:

for(size_t i = 0 ; i < num_of_arrays ; i++){
    cudaMemcpy(d_array[i], h_arra2[i], array_size * sizeof(int), cudaMemcpyHostToDevice);
}

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

Код выше, кажется, не работает.

Не могли бы вы сказать мне, что не так и помочь мне? Заранее спасибо.

1 ответ

Решение

Примерно так должно работать:

// create intermediate host array for storage of device row-pointers
int** h_array = (int**)malloc(num_of_arrays * sizeof(int*));
// create top-level device array pointer
int** d_array;
cudaMalloc((void**)&d_array, num_of_arrays * sizeof(int*));
// allocate each device row-pointer, then copy host data to it
for(size_t i = 0 ; i < num_of_arrays ; i++){
    cudaMalloc(&h_array[i], array_size * sizeof(int));
    cudaMemcpy(h_array[i], h_array2[i], array_size * sizeof(int), cudaMemcpyHostToDevice);
}
// fixup top level device array pointer to point to array of device row-pointers
cudaMemcpy(d_array, h_array, num_of_arrays * sizeof(int*), cudaMemcpyHostToDevice);

Вот вопрос / ответ, обсуждающий различные методы выделения двухмерных и трехмерных массивов.

Другие вопросы по тегам