CUBLAS erro de alocação de memória
-
05-07-2019 - |
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;
}
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.