2014-04-04 36 views
0

我正在使用GPU上的CUDA執行320 * 320的數組乘法。我觀察到使用了一個固定數量的內存,這是不明確的。例如,在考慮每個元素佔用4個字節的640 * 640數組乘法中,我們在代碼中有3個這樣的數組,應該消耗大約5 MB的GPU內存。但是,當我用nvidia-smi命令檢查它時,它顯示我消耗了53MB。這48 MB是不明的。對於1200 * 1200或任何其他可能的尺寸,情況也是如此。CUDA內核執行的內存要求是什麼?

+0

它總是48MB? – user3018144

+0

我只計算了數組乘法程序的統計數據。 – user3300239

+0

下落不明越來越大?當您使用320x320矩陣執行計算時,是否使用了總內存? – user3018144

回答

4

CUDA驅動保持衆多設備的存儲器分配,包括但不限於

  1. 本地存儲器* MultiprocessorCount * MaxThreadsPerMultiprocessor
    • 大小=(每線程+驅動程序指定的系統調用棧用戶指定LMEM大小)。
    • 實施例 - 15 SM GK110
      • 15多處理器
      • 2048 MaxThreadsPerMultiprocessor每個線程
      • 2048字節(cudaLimitStackSize)每個線程
      • 512字節爲系統調用堆棧
      • SIZE = 15 * 2048 *(2048 + 512)= 78643200字節
  2. printf的FIFO
  3. malloc的堆
  4. 常量緩衝器
    • 驅動程序分配每個數據流的多個常數緩衝器。這些用於傳遞啓動配置和啓動參數,模塊常量和常量變量。 PTX手冊有關於常量緩衝區的附加信息。
  5. CUDA動態並行緩衝器

司機推遲這些緩衝區的創建,直到必要的。這通常意味着內存分配將在其中一個API調用中完成以啓動內核。

通過cudaDeviceSetLimit可以在一定程度上控制項目1,2和3。

第4項與分配的流數和加載的模塊數成線性增長。在每個體系結構的不同點,驅動程序將開始混疊流常量緩衝區以限制資源分配。