CUDA异步内存复制-哪个硬件设备执行内存复制操作?

CUDA异步内存复制-哪个硬件设备执行内存复制操作?,cuda,Cuda,我对异步CUDA操作进行了一些研究,了解到有一个内核执行(“计算”)队列和两个内存复制队列,一个用于主机到设备(H2D),一个用于设备到主机(D2H) 操作可以在每个队列中同时运行。如果我理解正确,那么在计算队列中一次最多可以执行16个内核。(32在一些更现代的建筑上。) 但是,在D2H和H2D队列中只能同时发生1次内存传输。如果两者同时使用,则在两个不同方向上总共有两次同时的内存传输 假设我正确理解了这一切,我的问题是哪个设备“管理”数据传输 进一步读取表明GPU对主机(CPU)内存(RAM)

我对异步CUDA操作进行了一些研究,了解到有一个内核执行(“计算”)队列和两个内存复制队列,一个用于主机到设备(H2D),一个用于设备到主机(D2H)

操作可以在每个队列中同时运行。如果我理解正确,那么在计算队列中一次最多可以执行16个内核。(32在一些更现代的建筑上。)

但是,在D2H和H2D队列中只能同时发生1次内存传输。如果两者同时使用,则在两个不同方向上总共有两次同时的内存传输

假设我正确理解了这一切,我的问题是哪个设备“管理”数据传输

进一步读取表明GPU对主机(CPU)内存(RAM)具有直接内存访问(DMA)。这表明CUDA设备(GPU)包含一个管理内存传输的处理器。也许这个“处理器”是某种内存控制器,它驻留在主GPU硅中,通过PCI-e总线直接与主机内存通信

我的理解正确吗

当我读到GPU可以在内存传输发生时同时执行CUDA内核,并且除此之外,异步CUDA操作对于主机CPU是非阻塞的时,我最初感到困惑

这让我感到困惑,因为我最初认为主机CPU负责通过PCI-e总线将数据发送到(主机)RAM或从(主机)RAM发送到GPU

我对异步CUDA操作进行了一些研究,了解到有一个内核执行(“计算”)队列和两个内存复制队列,一个用于主机到设备(H2D),一个用于设备到主机(D2H)

你读错了。在支持GPU的CUDA中,您有更多的队列;它们中的每一个都可以用于计划各种工作:计算、D2H传输、H2D传输和其他操作

实际并行执行多少传输取决于GPU的具体情况。通常,正如@talonmies所指出的,NVIDIA GPU有一个或两个这样的处理器。但也请记住,吞吐量/带宽受到PCIe总线的限制,因此即使您有更多的传输引擎,也不会在整个过程中变得更好

当有一个引擎可用于D2H,一个引擎可用于H2D时,为每个传输方向指定一个队列是有意义的,因为传输无论如何都会序列化

我读到GPU可以在内存传输发生时同时执行CUDA内核

这是真的,在所有NVIDIA(和AMD)GPU上

异步CUDA操作对于主机CPU是非阻塞的

这也是事实。但是您可以启动内核并等待它结束。事实上,如果您使用CUDA运行时API并且没有指定用于调度内核的异步流,那么这就是默认行为

我最初假设主机CPU负责通过PCI-e总线将数据传送到(主机)RAM或从(主机)RAM传送到GPU


此语句的准确性并不决定GPU是否可以异步执行内核。事实上,有不同的硬件组件,包括CPU,可能与这种数据传输有关;但并非所有GPU CPU数据传输都需要CPU参与。

GPU有一个或两个板载DMA引擎,可以通过PCI-e总线直接访问固定内存,而无需与主机交互GPU@talonmies想必这些DMA引擎是内置在主GPU处理芯片硅中的处理器?这就是我要问的,它们显示在GPU的方框图中。除非你想追踪实际模具的SEM图像或x射线并对其进行逆向工程,否则你就处于非公开的专有信息领域。对于@Talonmes来说,这是一个离题的话题,如果方框图是公共领域的,那么这不是专有信息?这是一个混合了软件工程和硬件工程的问题。软件工程师询问硬件工程师或固件工程师如何在固件和硬件中实现,以更好地理解如何设计他们的软件,这种情况并不少见。