malloc是否有限制大小?

时间:2014-05-30 17:38:18

标签: c++ c cuda

当我尝试在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黑色中说它只有2 GB?

抱歉,我的英语很糟糕。感谢

2 个答案:

答案 0 :(得分:5)

一旦你进行了malloced检查你的指针。 Malloc ATTEMPTS为变量腾出空间,但它不能保证变量。这通常是由于您的环境施加的内存限制。您可以通过在malloc之后检查值来检查指针是否正确创建。

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

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

对于CUDA,您可以使用

显式设置堆大小
cudaDeviceSetLimit()

它位于documentation

答案 1 :(得分:5)

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