Jetson系列(包括TX1丁频,TX2按声,Xavier等)用的都是SoC芯片裹粤,CPU和GPU集成在一個芯片上终蒂,自然用的是同一個內存,因此GPU可以直接訪問內存上的數據(100多GB/s)而不用受到PCIE的限制(10多GB/s)遥诉。
因此拇泣,在CUDA編程中可以舍棄cudaMemcpy系列函數(相當于在同一個內存上徒勞地復制了一遍),轉而使用zero copy或者統(tǒng)一內存unified memory矮锈。
可以參考官方文檔的說法:
中文https://s0docs0nvidia0com.icopy.site/cuda/cuda-for-tegra-appnote/index.html#effective-usage-unified-memory
英文https://docs.nvidia.com/cuda/cuda-for-tegra-appnote/index.html
3.1. Memory Selection
CUDA應用程序可以使用各種類型的內存緩沖區(qū)霉翔,例如設備內存,可分頁的主機內存苞笨,固定內存和統(tǒng)一內存. 即使將這些內存緩沖區(qū)類型分配在同一物理設備上债朵,每種類型也具有不同的訪問和緩存行為子眶,如表1所示. 選擇最合適的內存緩沖區(qū)類型對于有效執(zhí)行應用程序很重要.
Device Memory
將設備內存用于可訪問性僅限于iGPU的緩沖區(qū). 例如,在具有多個內核的應用程序中序芦,可能存在僅由應用程序的中間內核用作輸入或輸出的緩沖區(qū). 這些緩沖區(qū)只能由iGPU訪問. 此類緩沖區(qū)應與設備內存一起分配.
Pageable Host Memory
將可分頁的主機內存用于可訪問性僅限于CPU的緩沖區(qū).
Pinned Memory
具有不同計算能力的Tegra?系統(tǒng)在I / O一致性方面表現出不同的行為. 例如臭杰,計算能力大于或等于7.2的Tegra?系統(tǒng)具有I / O一致性,而其他系統(tǒng)則不是I / O一致性. 在具有I / O一致性的Tegra?系統(tǒng)上谚中,固定內存的CPU訪問時間與可分頁內存一樣好渴杆,因為它已緩存在CPU上. 但是,在沒有I / O一致性的Tegra?系統(tǒng)上宪塔,固定內存的CPU訪問時間會更長磁奖,因為它不會緩存在CPU上.
建議將固定內存用于小型緩沖區(qū),因為此類緩沖區(qū)的緩存效果可以忽略不計某筐,而且與統(tǒng)一內存不同点寥,固定內存不涉及任何其他開銷. 沒有額外的開銷,如果訪問模式在iGPU上不是緩存友好的来吩,則固定內存對于大型緩沖區(qū)也更可取. 對于大型緩沖區(qū)敢辩,當以合并方式僅在iGPU上訪問該緩沖區(qū)一次時,iGPU上的性能可以與iGPU上的統(tǒng)一內存一樣好.
Unified Memory
統(tǒng)一內存已緩存在iGPU和CPU上. 在Tegra?上弟疆,在內核啟動戚长,同步和預取提示調用期間,在應用程序中使用統(tǒng)一內存需要附加的一致性和高速緩存維護操作. 在計算能力低于7.2的Tegra?系統(tǒng)上怠苔,由于缺乏I / O一致性同廉,所以這種一致性維護開銷會稍高一些.
在具有I / O一致性(計算能力為7.2或更高)的Tegra?設備上,其中統(tǒng)一內存同時緩存在CPU和iGPU上柑司,用于iGPU和CPU經常訪問的大緩沖區(qū)迫肖, 并且重復訪問iGPU最好使用統(tǒng)一內存,因為重復訪問可以抵消緩存維護成本. 在沒有I / O一致性(計算能力小于7.2)的Tegra?設備上攒驰,對于CPU和iGPU經常訪問的大型緩沖區(qū)以及iGPU上的訪問不是重復的蟆湖,統(tǒng)一內存仍然優(yōu)于固定內存,因為固定的內存不會同時緩存在CPU和iGPU上. 這樣玻粪,應用程序可以利用CPU上的統(tǒng)一內存緩存.
固定內存或統(tǒng)一內存可用于減少CPU和iGPU之間的數據傳輸開銷隅津,因為這兩個內存都可以直接從CPU和iGPU訪問. 在應用程序中,可以使用統(tǒng)一內存或固定內存分配主機和iGPU上必須可訪問的輸入和輸出緩沖區(qū).
注意:統(tǒng)一內存模型需要驅動程序和系統(tǒng)軟件來管理當前Tegra SOC上的一致性. 軟件管理的一致性本質上是不確定的劲室,因此不建議在安全的上下文中使用. 在這些應用中伦仍,最好使用零拷貝內存(固定內存).
評估統(tǒng)一內存開銷,固定內存緩存未命中以及應用程序中設備內存數據傳輸的影響很洋,以確定正確的內存選擇.
參考上述網址中Nvidia官方的表述充蓝,下列時候適合用Zero Copy(Pinned memory):
- small buffers because the caching effect is negligible for such buffers.(小的)
- large buffers if the access pattern is not cache friendly on iGPU. For large buffers, when the buffer is accessed only once on iGPU in a coalescing manner, performance on iGPU can be as good as unified memory on iGPU.(只訪問一次的)
對于比較大且需要多次訪問的buffer還是應使用統(tǒng)一內存UM。
TODO:
關于Zero Copy和Unified Memory的一些細節(jié)http://www.reibang.com/p/1790b4d41c5a