簡體   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