代码之家  ›  专栏  ›  技术社区  ›  stanigator

CUBLAS内存分配错误

  •  1
  • stanigator  · 技术社区  · 16 年前

    我尝试分配17338896个浮点数元素,如下所示(大约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;
        }
    

    CUBLAS_STATUS_ALLOC_FAILED 对于变量状态。这是否与机器上可用的显卡内存量(我的是128 mb)有关,或者这是我可以使用cublasAlloc()函数分配的内存量的限制(即与机器上可用的内存量无关)?我尝试使用cudamaloc()函数,但遇到了同样的问题。提前感谢您对此进行调查。

    --------------增加错误再现-------------------------------------

    #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;
    }
    
    1 回复  |  直到 10 年前
        1
  •  5
  •   MSalters    16 年前

    内存可以分割,这意味着您仍然可以分配多个较小的块,但不能分配一个较大的块。您的显卡显然需要一些内存来完成正常的2D任务。如果发生这种情况,将128MB分成两个几乎64MB的块,那么您将看到这种失败。