首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以强迫cudaMallocManaged在特定的gpu id上分配(例如通过cudaSetDevice)

是否可以强迫cudaMallocManaged在特定的gpu id上分配(例如通过cudaSetDevice)
EN

Stack Overflow用户
提问于 2022-09-03 16:47:21
回答 2查看 39关注 0票数 0

我想使用cudaMallocManaged,但是否可能强制它在多个gpu系统上分配特定GPU id (例如通过cudaSetDevice)上的内存?

原因是我需要在GPU上分配几个数组,而且我知道这些数组的哪一组需要一起工作,所以我想手动确保它们在同一个GPU上。

我搜索了CUDA的文件,但没有找到任何与此相关的信息。有人能帮忙吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-03 16:58:25

不,你不能通过cudaMallocManaged直接做。托管内存背后的思想是,分配迁移到任何需要的处理器上。

如果您希望手动确保托管分配在特定GPU上“呈现”(迁移到),则通常使用cudaMemPrefetchAsync。一些例子是这里这里。如果您知道需要在哪个GPU上使用数据,而不是使用“按需”迁移,则通常推荐这样做以获得良好的性能。

一些关于托管内存/统一内存使用的博客是这里这里,还有一些已记录的培训是可用的这里,第6节。

票数 2
EN

Stack Overflow用户

发布于 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开始,而不关心快速原型过程中的位置等等。稍后,您将分析代码,然后使用提示和预取来优化缓慢的部分,以获得(几乎)与显式内存管理和副本相同的性能。最后的代码可能不像显式管理那样容易阅读/不那么复杂(例如,cudaMemcpycudaMemPrefetchAsync取代),但最大的区别是,对于某些性能较差的错误,您要为某些错误付出代价,而不是使用错误的应用程序,例如可能被忽略的损坏数据。

在多GPU应用程序中,这种在一开始就不关心位置的想法可能不适用,但NVIDIA似乎希望cudaMallocManaged对于这种类型的工作流尽可能简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73593932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档