繁体   English   中英

malloc是否有限制大小?

[英]Is there a limit size of malloc?

当我尝试在TITAN BLACK中运行我的cuda程序时遇到问题,它是这样的(我简化了它,因此看起来并不复杂)

    int DIMX, DIMZ,DIMXM, DIMZM;

    DIMXM=5700;
    DIMZM=5700;

    DIMX=DIMXM+20;
    DIMZ=DIMZM+10;

    float *temptxz = (float*)malloc( sizeof(float)*(DIMX*DIMZ));    
    float *temptxx = (float*)malloc( sizeof(float)*(DIMX*DIMZ));        
    float *temptzz = (float*)malloc( sizeof(float)*(DIMX*DIMZ));        
    float *tempvz = (float*)malloc( sizeof(float)*(DIMX*DIMZ)); 
    float *tempvx = (float*)malloc( sizeof(float)*(DIMX*DIMZ));

    for (int ij=0; ij<DIMX*DIMZ; ij++)
    {
    temptxz[ij]=0.0;                
    temptxx[ij]=0.0;
    temptzz[ij]=0.0;
    tempvx[ij]=0.0;
    tempvz[ij]=0.0;
    } 

NX = 4700没关系; NZ = 4700; 但是,如果我再增加一点(使内存大小超过2 gb),编译就可以了,但是当我运行程序时,它崩溃了,并且警告是“ 0xC0000005:访问冲突写入位置0x00000000”。

那是因为在malloc中存在某种限制大小吗? 还是关于音高记忆的东西,在TITAN black中说只有2 GB?

对不起,我的英语不好。 谢谢

分配后检查指针。 Malloc ATTEMPTS可以在堆上为变量留出空间,但是不能保证已创建变量。 这通常是由于您的环境强加的内存限制。 您始终可以通过在malloc之后检查该值来检查指针是否正确创建。

x = malloc(SIZE);
if(x == NULL) //error

验证始终很重要,因为否则您将尝试写入不存在的内存地址(0x0)

专门针对CUDA,您可以使用以下命令显式设置堆大小

cudaDeviceSetLimit()

文档中

在Windows上,默认情况下32位进程的用户VA空间限制为2GB。 请参阅 MSDN页面,以了解不同Windows OS版本的限制以及可能增加限制的选项。 最好的解决方案是将应用程序编译为具有8TB用户空间VA限制的64位应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM