es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué cuMemAddressReserve() está fallando con CUDA_INVALID_VALUE?

Considere el siguiente programa (escrito en sintaxis C):

#include <cuda.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    CUresult result;
    unsigned int init_flags = 0;
    result = cuInit(init_flags);
    if (result != CUDA_SUCCESS) { exit(EXIT_FAILURE); }
    CUcontext ctx;
    unsigned int ctx_create_flags = 0;
    CUdevice device_id = 0;
    result = cuCtxCreate(&ctx, ctx_create_flags, device_id);
    // Nota: El contexto creado también se convierte en el contexto actual,
    // así que estamos dentro de un contexto a partir de ahora.
    if (result != CUDA_SUCCESS) { exit(EXIT_FAILURE); }
    CUdeviceptr requested = 0;
    CUdeviceptr reserved;
    size_t size = 0x20000;
    size_t alignment = 0; // por defecto
    unsigned long long reserve_flags = 0;

    // -----------------------------------
    // ==>> Error en la siguiente instrucción <<==
    // -----------------------------------

    result = cuMemAddressReserve(&reserved, size, alignment, requested, reserve_flags);
    if (result != CUDA_SUCCESS) {
        const char* error_string;
        cuGetErrorString(result, &error_string);
        fprintf(stderr, "cuMemAddressReserve() falló: %s\n", error_string);
        exit(EXIT_FAILURE);
    }
    return 0;
}

Esto falla al intentar hacer la reserva:
cuMemAddressReserve() falló: argumento no válido

¿Qué está mal con mis argumentos? ¿Es el tamaño? ¿La alineación? ¿Solicitar una dirección de 0? Si es lo último, ¿cómo puedo saber qué dirección solicitar si en realidad no me importa?</stdlib.h></stdio.h></cuda.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar con el argumento ‘requested’, el cual está establecido en 0. Este parámetro se utiliza para especificar una dirección base solicitada para la asignación, y pasar 0 significa que el controlador debe elegir una dirección. Sin embargo, el controlador de CUDA puede necesitar otras indicaciones para elegir una dirección que se ajuste a sus necesidades. Una de estas indicaciones es la alineación requerida, la cual está establecida en 0 en este ejemplo. Un enfoque mejor sería establecer un valor distinto de cero para el parámetro de alineación, basado en los requisitos de la memoria a asignar. Si realmente no le importa qué dirección se elige, podría alternativamente establecer el parámetro ‘requested’ en CU_MEM_ADDRESS_ANY, lo cual indica al controlador de CUDA que elija cualquier dirección disponible que satisfaga las demás restricciones.

Comments are closed.