3

我一直认为 Hyper-Q 技术不过是 GPU 中的流。后来我发现我错了(是吗?)。所以我读了一些关于 Hyper-Q 的书,却更加困惑了。我正在浏览一篇文章,它有以下两个陈述:

A. Hyper-Q 是一种灵活的解决方案,它允许来自多个 CUDA 流、多个消息传递接口 (MPI) 进程,甚至是一个进程中的多个线程的单独连接

B. Hyper-Q 增加了主机和 GK110 GPU 之间的连接总数(工作队列),允许同时进行 32 个硬件管理连接(与 Fermi 提供的单个连接相比)

在上述几点中,B 点表示可以从主机创建多个连接到单个 GPU。这是否意味着我可以通过不同的应用程序在一个简单的 GPU 上创建多个上下文?这是否意味着我必须在不同的流上执行所有应用程序?如果我的所有连接都消耗内存和计算资源,谁来管理资源(内存/核心)调度?

4

1 回答 1

6

将 HyperQ 视为设备端硬件中实现的流。

在 HyperQ 到来之前,例如在 Fermi 上,来自所有流的命令(内核​​启动、内存传输等)由主机上的驱动程序放置在单个工作队列中。这意味着命令不能相互超越,您必须小心地在主机上以正确的顺序发出它们以实现最佳重叠。

在 GK110 GPU 及更高版本的 HyperQ 设备上,设备上有(至少)32 个工作队列。这意味着来自不同队列的命令可以相对于彼此重新排序,直到它们开始执行。因此,上面链接的示例中的两个排序都导致 GK110 设备上有很好的重叠。

这对于多线程主机代码尤其重要,如果没有线程之间的额外同步,您将无法控制顺序。

请注意,在 32 个硬件队列中,默认情况下仅使用 8 个来节省资源。如果您需要更多,请将CUDA_​DEVICE_​MAX_​CONNECTIONS 环境变量设置为更高的值。

于 2019-05-22T07:00:36.533 回答