2009-10-21 8 views
1

Я попытался выделить 17338896 элементов чисел с плавающей запятой следующим образом (что составляет около 70 Мб):CUBLAS ошибка распределения памяти

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

Однако, я получаю сообщение об ошибке CUBLAS_STATUS_ALLOC_FAILED для переменного состояния. Будет ли это иметь какое-либо отношение к количеству доступной на компьютере памяти видеокарты (128 МБ на моей) или это будет ограничение объема памяти, которое я могу выделить, используя функцию cublasAlloc() (то есть не относящуюся к сумме памяти, доступной на машине)? Я попытался использовать функцию cudaMalloc(), и я столкнулся с той же проблемой. Заранее благодарим за это.

-------------- Добавление ошибки при воспроизведении ---------------------------- ---------

#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; 
} 
+0

Это первое распределение VRAM в вашей программе? Я, конечно, выделил большие блоки памяти без проблем, используя cudaMalloc(). Возможно, вы можете обеспечить минимальное воспроизведение? – Gabriel

+0

Да, это так. Что бы вы хотели увидеть для минимального воспроизведения? – stanigator

+0

Минимальное воспроизведение будет наименьшей полной программой, которая вызывает ошибку. Не более чем необходимо, в идеале я мог просто скопировать/вставить в файл C, выполнить компиляцию, ссылку и выполнить. Учитывая ваше описание, это должно быть не более нескольких строк C. – Gabriel

ответ

5

Память может фрагментироваться, что означает, что вы все равно можете выделить несколько меньших блоков, но не один большой блок. Очевидно, что вашей видеокарте потребуется некоторая память для обычной 2D-задачи. Если это произойдет, чтобы сломать 128 МБ на 2 блока почти 64 МБ, тогда вы увидите такой отказ.

+0

Ваше объяснение имеет смысл. Я выделил меньший объем памяти и не столкнулся с этой проблемой. Я буду тестировать это на другой машине с большим количеством памяти видеокарты, чтобы подтвердить, так ли это. – stanigator

 Смежные вопросы

  • Нет связанных вопросов^_^