[c++] ¿Por qué cudaMalloc () usa el puntero al puntero?



0 Answers

Añadiendo a la respuesta de Robert, pero primero para reiterar, es una API C, lo que significa que no admite referencias, lo que le permitiría modificar el valor de un puntero (no solo lo que apunta) dentro de la función . La respuesta de Robert Crovella lo explicó. También tenga en cuenta que debe ser void porque C tampoco admite la sobrecarga de funciones.

Además, cuando se utiliza una API C dentro de un programa C ++ (pero no se ha indicado esto), es común ajustar dicha función en una plantilla. Por ejemplo,

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

Hay dos diferencias con la forma en que llamaría a la función cudaAlloc anterior:

  1. Pase el puntero del dispositivo directamente, sin utilizar el operador de dirección ( & ) al llamarlo y sin convertirlo en un tipo void .
  2. Los segundos elements argumento ahora son la cantidad de elementos en lugar de la cantidad de bytes. El operador sizeof facilita. Esto es posiblemente más intuitivo para especificar elementos y no preocuparse por los bytes.

Por ejemplo:

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

Por ejemplo, cudaMalloc((void**)&device_array, num_bytes);

Esta pregunta se ha asked antes, y la respuesta fue "porque cudaMalloc devuelve un código de error", pero no lo entiendo: ¿qué tiene que hacer un doble puntero al devolver un código de error? ¿Por qué un simple puntero no puede hacer el trabajo?

Si escribo

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

el código de error se colocará en catch_status , y devolver un puntero simple a la memoria GPU asignada debería ser suficiente, ¿no es así?




Related