Pregunta

Intenté asignar 17338896 elementos de números de punto flotante de la siguiente manera (que es aproximadamente de 70 mb):

    state = cublasAlloc(theSim->Ndim*theSim->Ndim, 
                       sizeof(*(theSim->K0)), 
                       (void**)&K0cuda);
    if(state != CUBLAS_STATUS_SUCCESS) {
        printf("Error allocation video memory.\n");
        return -1;
    }

Sin embargo, recibo un mensaje de error de CUBLAS_STATUS_ALLOC_FAILED para el estado de la variable. ¿Tendría esto algo que ver con la cantidad de memoria de la tarjeta de video disponible en la máquina (128 mb en la mía) o sería un límite de la cantidad de memoria que puedo asignar usando la función cublasAlloc () (es decir, no es relevante para la cantidad)? de memoria disponible en la máquina)? Intenté usar la función cudaMalloc () y tengo el mismo problema. Gracias de antemano por investigar esto.

-------------- Adición de reproducción de error ----------------------------- --------

#include <cuda.h>
#include <stdio.h>
int main (int argc, char *argv[]) {

    // CUDA setup
    cublasStatus state;

    if(cublasInit() == CUBLAS_STATUS_NOT_INITIALIZED) {
        printf("CUBLAS init error.\n");
        return -1;
    }

    // Instantiate video memory pointers
    float *K0cuda;

    // Allocate video memory needed
    state = cublasAlloc(20000000, 
                        sizeof(float), 
                        (void**)&K0cuda);
    if(state != CUBLAS_STATUS_SUCCESS) {
        printf("Error allocation video memory.\n");
        return -1;
    }

    // Copy K0 from CPU memory to GPU memory
    // Note: before so, decide whether to integrate as a part of InsertionSim or
    //      CUDA content as a separate class
    //state = cublasSetMatrix(theSim->Ndim, theSim->Ndim, sizeof(*theSim->K0),
    //                      theSim->K0, theSim->Ndim, K0cuda, theSim->Ndim);
    //if(state != CUBLAS_STATUS_SUCCESS) {
    //  printf("Error copy to video memory.\n");
    //  return -1;
    //}

    // Free memory
    if(cublasFree(K0cuda) != CUBLAS_STATUS_SUCCESS) {
        printf("Error freeing video memory.\n");
        return -1;
    }

    // CUDA shutdown
    if(cublasShutdown() != CUBLAS_STATUS_SUCCESS) {
        printf("CUBLAS shutdown error.\n");
        return -1;
    }

    if(theSim != NULL) delete theSim;

    return 0;
}
¿Fue útil?

Solución

La memoria puede fragmentarse, lo que significa que aún puede asignar varios bloques más pequeños pero no un solo bloque grande. Su tarjeta de video obviamente necesitará algo de memoria para su tarea 2D normal. Si eso rompe los 128 MB en 2 bloques de casi 64 MB, entonces verás este tipo de falla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top