CUDA graphs是从多个操作中综合复杂操作的一种新方法。使用“流捕获”,您似乎可以运行多种操作,包括CuBlas和类似的库操作,并将它们捕获为单个“元内核”。
对我来说,不清楚的是这些图的数据流是如何工作的。在捕获阶段,我为输入分配了内存A,为临时值分配了内存B,为输出分配了内存C。但是,当我在图中捕捉到这一点时,我没有捕捉到内存分配。因此,当我实例化这些图的多个副本时,它们不能共享输入内存A、临时工作区B或输出内存C。
那么这是如何工作的呢?也就是说,当我调用cudaGraphLaunch
时,我看不到提供输入参数的方法。我捕获的图基本上是从一个cudaMemcpyHostToDevice
开始的,这个图如何知道要复制哪个主机内存以及将其放在哪里?
背景:我发现CUDA在内核启动时存在严重的瓶颈;我的AVX2代码在移植到CUDA时要慢13倍。内核本身看起来很好(根据NSight的说法),这只是安排数十万次内核启动的开销。
发布于 2018-10-12 03:02:46
内存分配通常在图定义/实例化或“捕获”之外完成。
但是,graphs提供了"memory copy" nodes,您通常需要在其中执行cudaMemcpy
类型操作。
在图形定义时,您将为每个图形节点传递一组参数(这取决于节点类型,例如,如果是内存复制节点,则为cudaMemcpy
操作的参数;如果是内核节点,则为内核参数)。这些参数确定执行该图时将使用的实际内存分配。
如果您想要使用一组不同的分配,一种方法是用不同的参数实例化另一个具有不同参数的节点。这可以通过重复整个过程,或者从现有图开始,对节点参数进行更改,然后用这些更改实例化一个图来完成。
目前,在cuda图中,不可能执行节点参数到特定图/节点的运行时绑定(即,在图的“启动”点)。当然,在未来的版本中可能会引入新的功能。
请注意,CUDA10中有一个名为simpleCudaGraphs
的CUDA示例代码,它演示了内存复制节点和内核节点的使用,以及如何在节点之间创建依赖关系(有效地执行依赖关系)。
https://stackoverflow.com/questions/52764753
复制相似问题