почему мы должны передавать указатель на указатель на cudaMalloc - PullRequest
3 голосов
/ 22 марта 2012

Следующие коды широко используются для выделения глобальной памяти графического процессора:

float *M;
cudaMalloc((void**)&M,size);

Интересно, почему мы должны передавать указатель на указатель на cudaMalloc, и почему он не был разработан как:

float *M;
cudaMalloc((void*)M,size);

Спасибо за любые простые описания!

Ответы [ 2 ]

6 голосов
/ 22 марта 2012

cudaMalloc необходимо записать значение указателя в M (не *M), поэтому M необходимо передать по ссылке.

Другим способом было бы вернуть указатель классическим malloc способом. Однако, в отличие от malloc, cudaMalloc возвращает состояние ошибки, как и все функции времени выполнения CUDA.

0 голосов
/ 22 марта 2012

Чтобы объяснить необходимость чуть более подробно:

До звонка на cudaMalloc, M баллов ... везде, не определено. После вызова cudaMalloc вы хотите, чтобы действительный массив присутствовал в той области памяти, на которую он указывает. Можно наивно сказать «затем просто выделить память в этом месте», но это, конечно, вообще невозможно: неопределенный адрес обычно даже не будет в допустимой памяти. cudaMalloc необходимо иметь возможность выбрать местоположение. Но если указатель вызывается по значению, нет никакого способа сообщить вызывающей стороне, где.

В C ++ можно сделать подпись

template<typename PointerType>
cudaStatus_t cudaMalloc(PointerType& ptr, size_t);

, где передача ptr по ссылке позволяет функции изменять местоположение, но поскольку cudaMalloc является частью CUDA C API, это не вариант. Единственный способ передать что-то как модифицируемое в C - это передать указатель на него. И сам объект является указателем. То, что вам нужно передать, это указатель на указатель.

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