我想使用cudaMallocManaged,但是否可能强制它在多个gpu系统上分配特定GPU id (例如通过cudaSetDevice)上的内存?
原因是我需要在GPU上分配几个数组,而且我知道这些数组的哪一组需要一起工作,所以我想手动确保它们在同一个GPU上。
我搜索了CUDA的文件,但没有找到任何与此相关的信息。有人能帮忙吗?谢谢!
发布于 2022-09-03 16:58:25
发布于 2022-09-05 09:37:45
来自N.2.1.1.使用cudaMallocManaged()的显式分配 (重点雷):
默认情况下,计算能力低于6.x的设备直接在GPU上分配托管内存。但是,当调用cudaMallocManaged()时,计算能力6.x或更高的设备不分配物理内存:在这种情况下,物理内存是在第一次触摸上填充的,并且可能驻留在CPU或GPU上。
因此,对于最近的任何体系结构,它的工作方式就像CPU上的NUMA节点:分配并没有说明内存的物理分配位置。相反,这取决于“第一次触摸”,即初始化。因此,只要第一次写入这些位置来自GPU,您希望它是常驻,您是好的。
因此,我也不认为一个特性请求会得到支持。在这个内存模型中,分配和放置只是完全独立的操作。
除了Robert描述的显式预取之外,您还可以使用cudaMemAdvise
(参见N.3.2.数据使用提示)提供更多信息,说明哪些设备将以哪种方式访问哪个内存位置(读/写)。
所有这些背后的想法是,您可以从仅仅使用cudaMallocManaged
开始,而不关心快速原型过程中的位置等等。稍后,您将分析代码,然后使用提示和预取来优化缓慢的部分,以获得(几乎)与显式内存管理和副本相同的性能。最后的代码可能不像显式管理那样容易阅读/不那么复杂(例如,cudaMemcpy
被cudaMemPrefetchAsync
取代),但最大的区别是,对于某些性能较差的错误,您要为某些错误付出代价,而不是使用错误的应用程序,例如可能被忽略的损坏数据。
在多GPU应用程序中,这种在一开始就不关心位置的想法可能不适用,但NVIDIA似乎希望cudaMallocManaged
对于这种类型的工作流尽可能简单。
https://stackoverflow.com/questions/73593932
复制相似问题