malloc的大小有限制吗?

Is there a limit size of malloc?

本文关键字:有限制 malloc      更新时间:2023-10-16

我有一个问题,当我试图运行我的cuda程序在TITAN BLACK,这是这样的东西(我简化了它,所以它看起来不复杂)

    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是可以的;新西兰= 4700;但是如果我再增加一点(使内存大小超过2 gb),编译正常,但是当我运行程序时,它崩溃了,警告是"0xC0000005:访问违规写入位置0x00000000。"

是因为在malloc中有某种大小限制吗?还是说TITAN黑色的pitch memory只有2gb ?

对不起,我的英语很糟糕。由于

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

一旦发生错置,请检查指针。Malloc试图在堆上为变量腾出空间,但它不能保证该变量被占用。这通常是由于您的环境所施加的内存限制。你总是可以通过在malloc之后检查指针的值来检查指针是否被正确创建。

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

这个验证总是很重要的,因为否则你将试图写一个不存在的内存地址(0x0)

对于CUDA,您可以使用

显式设置堆大小。
cudaDeviceSetLimit()

在文档中