Чтобы объяснить необходимость в немного более подробно:
Перед вызовом cudaMalloc
, M
точек ... в любом месте, не определено. После вызова cudaMalloc
вы хотите, чтобы действительный массив присутствовал в ячейке памяти, на которой он указывает. Можно было бы наивно сказать «тогда просто выделить память в этом месте», но это, конечно, вообще невозможно: неопределенный адрес, как правило, даже не будет в действительной памяти. cudaMalloc
должен уметь выбрать место. Но если указатель вызывается по значению, нет способа сказать вызывающему, где.
В C++ можно сделать подпись
template<typename PointerType>
cudaStatus_t cudaMalloc(PointerType& ptr, size_t);
где проходит ptr
по ссылке позволяет функции изменить расположение, но поскольку cudaMalloc
является частью API CUDA C это не вариант. Единственный способ передать что-то, модифицируемое в C, - это передать указатель на него. И объект сам по себе является указателем, который вам нужно передать, является указателем на указатель.
cudaMalloc необходимо * вернуть * указатель, поэтому вам нужно передать указатель на указатель –