【问题标题】:Is there a limit size of malloc?malloc 的大小是否有限制?
【发布时间】:2014-05-30 17:38:17
【问题描述】:

当我尝试在 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 没问题;新西兰=4700;但是如果我再增加一点(使内存大小超过 2 gb),编译会很好,但是当我运行程序时它崩溃了并且警告是“0xC0000005:访问冲突写入位置 0x00000000。”

这是因为 malloc 中存在某种限制大小吗? 或者关于 TITAN black 中的音高内存只有 2 GB 的内容?

对不起我糟糕的英语。谢谢

【问题讨论】:

  • 不,这是由于操作系统对单个进程可用内存的某种限制。
  • 这里显示的代码是设备代码还是主机代码?根据您发布的警告消息,它似乎是主机代码。如果是这种情况,您是在 32 位还是 64 位操作系统上运行?您的系统中有多少内存(不是 GPU 内存、主机内存)?
  • 我想size_t 可以容纳的最大值将是绝对最大值。
  • 我正在使用 64 位 Windows 32 GB 内存。那么有什么解决办法吗?

标签: c++ c cuda


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    对于 CUDA,您可以使用

    显式设置堆大小
    cudaDeviceSetLimit()
    

    documentation

    【讨论】:

    • 原来我忘记在编译器上更改“目标到 x64 机器”选项。谢谢。
    • 如果那是适合您的解决方案,请将其他答案标记为正确,因为那是直接建议目标平台的答案。 (看来您现在已经这样做了!很高兴您的问题得到了解决)
    猜你喜欢
    • 2022-10-23
    • 2018-06-24
    • 1970-01-01
    • 2013-12-13
    • 2016-11-15
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多