2012-03-21 2 views
3

следующие коды широко используются для GPU глобального распределения памяти:почему мы должны передать указатель на указатель на cudaMalloc

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

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

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

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

+1

cudaMalloc необходимо * вернуть * указатель, поэтому вам нужно передать указатель на указатель –

ответ

6

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

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

+3

Мартин Джеймс: причина не возврата указателя, как malloc, заключается в том, что все функции выполнения cuda должны возвращать статус ошибки. Чтобы соответствовать этому, вместо этого указатель берется как первый параметр. –

+0

@Ashwin - спасибо за информацию! –

+0

... и спасибо Джареду за редактирование для уточнения и точности. –

0

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

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

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

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

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

Смежные вопросы