Error de asignación de memoria CUBLAS
-
05-07-2019 - |
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;
}
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.