据我所知,cudaMallocManaged
通过消除主机和设备上显式内存分配的需要,简化了内存访问。考虑主机内存明显大于设备内存的情况,例如16 GB主机和内存。 2 GB设备,这些日子相当普遍。如果我正在处理从外部数据源读取的大尺寸输入数据,例如4-5 GB。我是否被迫采用明确的主机和设备内存分配(因为设备内存不足以同时容纳)或者CUDA统一内存模型是否有办法解决这个问题(例如,根据需要自动分配/解除分配)?
答案 0 :(得分:6)
我是否被迫采用明确的主机和设备内存分配?
您不必使用显式的主机和设备内存分配,但您将被迫手动处理分配的内存量。这是因为,至少在当前硬件上,CUDA统一虚拟内存不允许您超额预订GPU内存。换句话说,一旦分配的内存超过设备上可用的内存,cudaMallocManaged
将失败。但这并不意味着你不能使用cudaMallocManaged
,它只是意味着你必须通过“流式传输”数据而不是分配所有内容来跟踪分配的内存量并且永远不会超过设备可以支持的内存量。马上。
纯粹的猜测是因为我不能代表NVIDIA,但我相信这可能是未来硬件未来的改进之一。
事实上,在上述预测之后一年半,从CUDA 8开始,Pascal GPU现在增强了页面错误功能,允许内存页面在主机和设备之间进行迁移而无需明确干预来自程序员。