两个进程可以共享相同的 GPU 内存吗? (CUDA)

Posted

技术标签:

【中文标题】两个进程可以共享相同的 GPU 内存吗? (CUDA)【英文标题】:can two process shared same GPU memory? (CUDA) 【发布时间】:2017-06-21 07:14:56 【问题描述】:

在 CPU 世界中,可以通过内存映射来实现。可以为 GPU 做类似的事情吗?

如果两个进程可以共享同一个 CUDA 上下文,我认为这将是微不足道的 - 只需传递 GPU 内存指针。是否可以在两个进程之间共享相同的 CUDA 上下文?

我能想到的另一种可能性是将设备内存映射到内存映射的主机内存。由于它是内存映射的,因此可以在两个进程之间共享。这是否有意义/可能,是否有任何开销?

【问题讨论】:

@RobertCrovella:这可能是任何人都能提供的最佳答案。如果你想添加它,我会很高兴地支持它 【参考方案1】:

CUDA MPS 有效地允许来自 2 个或更多进程的 CUDA 活动在 GPU 上共享相同的上下文。但是,这不能满足您的要求:

两个进程可以共享相同的 GPU 内存吗?

实现此目的的一种方法是通过 CUDA IPC(进程间通信)API。

这将允许您在多个进程之间共享分配的设备内存区域(即通过cudaMalloc 分配的内存区域)。 This answer 包含了解 CUDA IPC 的其他资源。

但是,根据我的测试,这不能在多个进程之间共享主机固定内存区域(例如,通过 cudaHostAlloc 分配的区域)。内存区域本身可以使用特定操作系统可用的普通 IPC 机制共享,但不能使其在 2 个或更多进程中显示为“固定”内存(根据我的测试)。

【讨论】:

您能否详细说明为什么共享 cuda 上下文不能共享设备内存?难道即使cuda上下文相同,A进程的设备内存指针的值在B进程中仍然没有意义? 我没有说“共享 cuda 上下文不会启用共享设备内存”。我说 CUDA MPS 不启用共享设备内存。如果您想了解共享 cuda 上下文是否允许共享设备内存,则必须更具体。对于同一进程中的两个线程,它们可以共享相同的上下文。 CUDA 没有为两个单独的进程共享相同的上下文提供方法 AFAIK。如果您认为有一个,请具体说明您将如何在两个单独的进程之间共享相同的 cuda 上下文。

以上是关于两个进程可以共享相同的 GPU 内存吗? (CUDA)的主要内容,如果未能解决你的问题,请参考以下文章

多个进程可以共享一个 CUDA 上下文吗?

多线程和多进程的区别

如何查看哪些进程在使用共享内存

gpu3d和内存是啥关系

IPC在两个不相关的节点js进程之间使用共享内存通信

2个进程(应用程序)之间的共享内存