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