[c++] Perché cudaMalloc () usa il puntatore al puntatore?


Answers

Aggiungendo la risposta di Robert, ma per prima cosa reiterare, si tratta di un'API C, il che significa che non supporta i riferimenti, il che consentirebbe di modificare il valore di un puntatore (non solo quello che viene indicato) all'interno della funzione . La risposta di Robert Crovella lo ha spiegato. Si noti inoltre che deve essere void perché anche C non supporta l'overloading delle funzioni.

Inoltre, quando si utilizza un'API C all'interno di un programma C ++ (ma non lo si è detto), è comune avvolgere tale funzione in un modello. Per esempio,

template<typename T>
cudaError_t cudaAlloc(T*& d_p, size_t elements)
{
    return cudaMalloc((void**)&d_p, elements * sizeof(T));
}

Esistono due differenze con il modo in cui si chiamerebbe la funzione cudaAlloc sopra cudaAlloc :

  1. Passa direttamente il puntatore del dispositivo, senza utilizzare l'operatore address-of ( & ) quando lo chiami e senza eseguire il cast di un tipo void .
  2. Gli elements secondo argomento sono ora il numero di elementi anziché il numero di byte. L'operatore sizeof facilita questo. Questo è probabilmente più intuitivo per specificare gli elementi e non preoccuparsi dei byte.

Per esempio:

float *d = nullptr;  // floats, 4 bytes per elements
size_t N = 100;      // 100 elements

cudaError_t err = cudaAlloc(d,N);      // modifies d, input is not bytes

if (err != cudaSuccess)
    std::cerr << "Unable to allocate device memory" << std::endl;
Question

Ad esempio, cudaMalloc((void**)&device_array, num_bytes);

Questa domanda è stata asked prima e la risposta è stata "perché cudaMalloc restituisce un codice di errore", ma non capisco - cosa ha a che fare un doppio puntatore con la restituzione di un codice di errore? Perché un puntatore semplice non può fare il lavoro?

Se scrivo

cudaError_t catch_status;
catch_status = cudaMalloc((void**)&device_array, num_bytes);

il codice di errore verrà inserito in catch_status e restituire un semplice puntatore alla memoria della GPU allocata dovrebbe essere sufficiente, non dovrebbe?




Links