C++ CUBLAS内存分配错误

C++ CUBLAS内存分配错误,c++,memory-management,cuda,cublas,C++,Memory Management,Cuda,Cublas,我尝试分配17338896个浮点数元素,如下所示(大约70 mb): 但是,我收到变量状态的CUBLAS\u STATUS\u ALLOC\u FAILED错误消息。这是否与机器上可用的显卡内存量(我的是128 mb)有关,或者这是我可以使用cublasAlloc()函数分配的内存量的限制(即与机器上可用的内存量无关)?我尝试使用cudamaloc()函数,但遇到了同样的问题。提前感谢您对此进行调查 --------------增加错误再现----------------------------

我尝试分配17338896个浮点数元素,如下所示(大约70 mb):

但是,我收到变量状态的
CUBLAS\u STATUS\u ALLOC\u 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;
}
#包括
#包括
int main(int argc,char*argv[]){
//CUDA设置
古巴国家;
if(cublasInit()==CUBLAS\u状态\u未初始化){
printf(“CUBLAS init错误。\n”);
返回-1;
}
//实例化视频内存指针
浮动*K0cuda;
//分配所需的视频内存
州=库布拉萨洛克(20000000,
sizeof(浮动),
(无效**)和K0cuda);
if(state!=CUBLAS\u STATUS\u SUCCESS){
printf(“错误分配视频内存。\n”);
返回-1;
}
//将K0从CPU内存复制到GPU内存
//注意:在此之前,请决定是否将集成作为InsertionSim的一部分或
//CUDA内容作为一个单独的类
//状态=立方体矩阵(theSim->Ndim,theSim->Ndim,sizeof(*theSim->K0),
//theSim->K0,theSim->Ndim,K0cuda,theSim->Ndim);
//if(state!=CUBLAS\u STATUS\u SUCCESS){
//printf(“复制到视频内存时出错。\n”);
//返回-1;
//}
//空闲内存
if(cublasFree(K0cuda)!=CUBLAS\u状态\u成功){
printf(“释放视频内存时出错。\n”);
返回-1;
}
//CUDA关机
如果(cublashutdown()!=CUBLAS\u状态\u成功){
printf(“CUBLAS关闭错误。\n”);
返回-1;
}
如果(SIM!=NULL)删除SIM;
返回0;
}

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

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

这是您程序中的第一个VRAM分配吗?我以前使用cudamaloc()分配过较大的内存块,没有问题。也许你能提供最低限度的复制?是的。对于最小复制,您希望看到什么?最小复制是产生错误的最小完整程序。没有什么比必要的更重要的了,理想的情况是我可以复制/粘贴到一个C文件中,编译、链接和执行。根据您的描述,这不应该超过几行C。请参阅原始问题帖子。这是您程序中的第一个VRAM分配吗?我以前使用cudamaloc()分配过较大的内存块,没有问题。也许你能提供最低限度的复制?是的。对于最小复制,您希望看到什么?最小复制是产生错误的最小完整程序。没有什么比必要的更重要的了,理想的情况是我可以复制/粘贴到一个C文件中,编译、链接和执行。根据您的描述,这不应该超过几行C。请参阅原始问题帖子。您的解释有道理。我分配了更少的内存,没有遇到这个问题。我将在另一台拥有更多显卡内存的机器上测试这一点,以确认是否属实。你的解释是有道理的。我分配了更少的内存,没有遇到这个问题。我将在另一台拥有更多显卡内存的机器上测试这一点,以确认是否属实。
#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;
}