cuda - CUDA 图中的节点如何连接?

标签 cuda cuda-graphs

CUDA graphs是一种从多个操作合成复杂操作的新方法。通过“流捕获”,您似乎可以运行混合操作,包括 CuBlas 和类似的库操作,并将它们捕获为单个“元内核”。

我不清楚这些图表的数据流是如何工作的。在捕获阶段,我为输入分配内存 A,为临时值分配内存 B,为输出分配内存 C。但是当我在图表中捕获它时,我没有捕获内存分配。因此,当我实例化这些图的多个副本时,它们无法共享输入内存 A、临时工作区 B 或输出内存 C。

那么这是如何工作的呢? IE。当我调用 cudaGraphLaunch 时,我看不到提供输入参数的方法。我捕获的图表基本上以 cudaMemcpyHostToDevice 开头,图表如何知道要复制哪个主机内存以及将其放在哪里?

背景:我发现 CUDA 在内核启动时遇到严重瓶颈;当移植到 CUDA 时,我的 AVX2 代码慢了 13 倍。内核本身看起来很好(根据 NSight),这只是调度数十万次内核启动的开销。

最佳答案

内存分配通常在图形定义/实例化或“捕获”之外完成。

但是,图表提供了 "memory copy" nodes ,您通常会在其中执行 cudaMemcpy 类型操作。

在图形定义时,您为每个图形节点传递一组参数(这取决于节点类型,例如,如果它是内存复制节点,则为 cudaMemcpy 操作传递参数) ,或内核参数(如果它是内核节点)。这些参数确定执行该图时将使用的实际内存分配。

如果您想使用一组不同的分配,一种方法是为发生更改的节点使用不同的参数实例化另一个图。这可以通过重复整个过程来完成,或者从现有图开始,对节点参数进行更改,然后使用这些更改实例化图。

目前,在 cuda 图中,无法将节点参数执行运行时绑定(bind)(即在图“启动”时)到特定图/节点。当然, future 的版本中可能会引入新功能。

请注意,CUDA 10 中有一个名为 simpleCudaGraphs 的 CUDA 示例代码,它演示了内存复制节点和内核节点的使用,以及如何在它们之间创建依赖关系(有效的执行依赖关系)节点。

关于cuda - CUDA 图中的节点如何连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52764753/

相关文章:

从全局函数调用设备函数

CUDA 分支分歧没有任何区别

c++ - 访问使用 pinned_allocator 分配的 host_vector 项(推力库)

cuda - 在cuda graph中使用多流,执行顺序不受控制

CUDA:cudaMemcpy 仅在仿真模式下工作

linux - Linux下生成CUDA程序dll