Pergunta

I tentou repartir 17338896 elementos de números de ponto flutuante como se segue (que é cerca 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;
    }

No entanto, estou recebendo mensagem de erro de CUBLAS_STATUS_ALLOC_FAILED para o Estado variável. Será que isso tem alguma coisa a ver com a quantidade de memória da placa de vídeo disponível na máquina (128 mb em minas) ou isso seria um limite da quantidade de memória que eu possa alocar usando a função cublasAlloc () (ou seja, não é relevante para a quantidade de memória disponível na máquina)? Eu tentei usar a função cudaMalloc () e eu estou correndo para o mesmo problema. Agradecemos antecipadamente para olhar para isso.

-------------- A adição de erro Reprodução ----------------------------- --------

#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;
}
Foi útil?

Solução

A memória pode fragmentar, o que significa que você ainda pode alocar vários blocos menores, mas nem um único grande bloco. Sua placa de vídeo irá, obviamente, precisa de alguma memória para sua tarefa normal de 2D. Se isso acontecer para quebrar os 128 MB em 2 blocos de quase 64 MB, então você veria esse tipo de falha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top