Jetson系列(包括TX1,TX2,Xavier等)用的都是SoC芯片,CPU和GPU集成在一个芯片上,自然用的是同一个内存,因此GPU可以直接访问内存上的数据(100多GB/s)而不用受到PCIE的限制(10多GB/s)。
因此,在CUDA编程中可以舍弃cudaMemcpy系列函数(相当于在同一个内存上徒劳地复制了一遍),转而使用zero copy或者统一内存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应用程序可以使用各种类型的内存缓冲区,例如设备内存,可分页的主机内存,固定内存和统一内存. 即使将这些内存缓冲区类型分配在同一物理设备上,每种类型也具有不同的访问和缓存行为,如表1所示. 选择最合适的内存缓冲区类型对于有效执行应用程序很重要.
Device Memory
将设备内存用于可访问性仅限于iGPU的缓冲区. 例如,在具有多个内核的应用程序中,可能存在仅由应用程序的中间内核用作输入或输出的缓冲区. 这些缓冲区只能由iGPU访问. 此类缓冲区应与设备内存一起分配.
Pageable Host Memory
将可分页的主机内存用于可访问性仅限于CPU的缓冲区.
Pinned Memory
具有不同计算能力的Tegra®系统在I / O一致性方面表现出不同的行为. 例如,计算能力大于或等于7.2的Tegra®系统具有I / O一致性,而其他系统则不是I / O一致性. 在具有I / O一致性的Tegra®系统上,固定内存的CPU访问时间与可分页内存一样好,因为它已缓存在CPU上. 但是,在没有I / O一致性的Tegra®系统上,固定内存的CPU访问时间会更长,因为它不会缓存在CPU上.
建议将固定内存用于小型缓冲区,因为此类缓冲区的缓存效果可以忽略不计,而且与统一内存不同,固定内存不涉及任何其他开销. 没有额外的开销,如果访问模式在iGPU上不是缓存友好的,则固定内存对于大型缓冲区也更可取. 对于大型缓冲区,当以合并方式仅在iGPU上访问该缓冲区一次时,iGPU上的性能可以与iGPU上的统一内存一样好.
Unified Memory
统一内存已缓存在iGPU和CPU上. 在Tegra®上,在内核启动,同步和预取提示调用期间,在应用程序中使用统一内存需要附加的一致性和高速缓存维护操作. 在计算能力低于7.2的Tegra®系统上,由于缺乏I / O一致性,所以这种一致性维护开销会稍高一些.
在具有I / O一致性(计算能力为7.2或更高)的Tegra®设备上,其中统一内存同时缓存在CPU和iGPU上,用于iGPU和CPU经常访问的大缓冲区, 并且重复访问iGPU最好使用统一内存,因为重复访问可以抵消缓存维护成本. 在没有I / O一致性(计算能力小于7.2)的Tegra®设备上,对于CPU和iGPU经常访问的大型缓冲区以及iGPU上的访问不是重复的,统一内存仍然优于固定内存,因为固定的内存不会同时缓存在CPU和iGPU上. 这样,应用程序可以利用CPU上的统一内存缓存.
固定内存或统一内存可用于减少CPU和iGPU之间的数据传输开销,因为这两个内存都可以直接从CPU和iGPU访问. 在应用程序中,可以使用统一内存或固定内存分配主机和iGPU上必须可访问的输入和输出缓冲区.
注意:统一内存模型需要驱动程序和系统软件来管理当前Tegra SOC上的一致性. 软件管理的一致性本质上是不确定的,因此不建议在安全的上下文中使用. 在这些应用中,最好使用零拷贝内存(固定内存).
评估统一内存开销,固定内存缓存未命中以及应用程序中设备内存数据传输的影响,以确定正确的内存选择.
参考上述网址中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还是应使用统一内存UM。
TODO:
关于Zero Copy和Unified Memory的一些细节https://www.jianshu.com/p/1790b4d41c5a
网友评论