Массив указателей в CUDA - PullRequest
       17

Массив указателей в CUDA

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

Можно ли передать массив указателей ядру CUDA?
Я ищу что-то вроде этого:

__global__ void Kernel(int **arr)  
{  
     int *temp = arr[blockDim.x];
     temp[blockIdx.x] = blockIdx.x;
}  

Как я могу выделить память CUDA для такой структуры?

Ответы [ 2 ]

4 голосов
/ 26 ноября 2011

Выделение памяти для такого массива не является проблемой, вы сделаете это с помощью cudaMalloc (sizeof (void *) * SIZE). Однако, запись правильных значений в это главная проблема. Единственный способ изменить значения в памяти устройства из функции хоста - это на самом деле копирование информации из памяти хоста в память устройства (cudaMemcpy () или cudaMemcpyToSymbol ()). Таким образом, чтобы записать указатели устройства в память устройства, у нас должен быть указатель на память устройства в памяти хоста, что я не считаю возможным. (указатель, который хранится в переменных хоста, выделенных cudaMalloc (), не является фактическим указателем в памяти устройства). Таким образом, единственный способ записать правильные значения в массив - из ядра, что делает неудобным массив указателей. Я предлагаю использовать указатели вместо указателей, это намного лучше. По сути, если в вашем массиве индексов вы написали {4,3,0,1,2}, это означает, что первый элемент указывает на некоторый массив в индексе 4, второй - на третий элемент и так далее. Если вы хотите указать несколько массивов, вы должны выполнить индексацию по некоторому правилу, в котором вы будете заполнять массив индексов и в котором вы будете получать доступ к памяти из ядра.

1 голос
/ 25 ноября 2011

В настоящее время я занимаюсь обработкой изображений в CUDA, и я рекомендую вам просто выделить линейный буфер памяти и использовать схему индексации, а не работать с массивами указателей.Это намного проще в моем опыте.Мой 2с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...