理解CUDA依赖性检查

理解CUDA依赖性检查,cuda,Cuda,CUDA C编程指南提供了以下声明: 适用于支持并发内核执行且具有计算能力3.0的设备 或更低级别,任何需要依赖项检查以查看流式内核 发射完成: ‣仅当所有先前内核的所有线程块从任何 CUDA上下文中的流已开始执行 ‣阻止所有后续内核从CUDA上下文中的任何流启动,直到内核启动 正在检查的启动已完成 我在这里迷路了。什么是依赖性检查?我可以说,在某些设备内存上执行内核需要对所有以前的内核或涉及相同设备内存的内存传输进行依赖性检查吗?如果这是真的(可能不是真的),那么根据上面的语句,这个依赖性检查

CUDA C编程指南提供了以下声明:

适用于支持并发内核执行且具有计算能力3.0的设备 或更低级别,任何需要依赖项检查以查看流式内核 发射完成:

‣仅当所有先前内核的所有线程块从任何 CUDA上下文中的流已开始执行

‣阻止所有后续内核从CUDA上下文中的任何流启动,直到内核启动 正在检查的启动已完成

我在这里迷路了。什么是依赖性检查?我可以说,在某些设备内存上执行内核需要对所有以前的内核或涉及相同设备内存的内存传输进行依赖性检查吗?如果这是真的(可能不是真的),那么根据上面的语句,这个依赖性检查将阻止来自任何其他流的所有后续内核,因此之后不会发生异步或并发执行,这似乎不是真的


任何解释或详细说明将不胜感激

首先,我建议您访问nvidia的网站,观看关于并发和流的网络研讨会

进一步考虑以下几点:

  • 向同一流发出的命令被视为依赖命令 e、 g.您将在本周的一些数据的memcopy之后,将内核插入流 内核将访问。内核取决于可用的数据

  • 因此,同一流中的命令保证按顺序执行(或同步执行,通常用作同义词)
  • 但是,不同流中的命令是独立的,可以并发运行
  • 因此,依赖关系仅为程序员所知,并使用流表示(以避免错误)
以下仅对应于计算能力为3.0或更低的设备(如quide中所述)。如果您想更多地了解compute capability 3.5对流调度行为的更改,请查看和相应的。在这一点上,我还想引用我找到HyperQ示例的线程:)

关于你的第二个问题:我不太明白你所说的“某个设备内存上的内核执行”或“涉及设备内存的内核执行”是什么意思,所以我把你的陈述缩减为:

内核执行需要对所有以前的内核和内存传输进行依赖性检查

最好是:

CUDA操作需要依赖项检查,以查看同一流中先前的CUDA操作是否已完成


我想你这里的问题是“开始执行”这个表达。这意味着仍然可以独立(即在不同的流上)启动内核,它将与以前的内核同时启动,如果他们都开始执行,并且有足够的设备资源可用。

首先,我建议您访问nvidia的网站,观看关于并发和流的网络研讨会

进一步考虑以下几点:

  • 向同一流发出的命令被视为依赖命令 e、 g.您将在本周的一些数据的memcopy之后,将内核插入流 内核将访问。内核取决于可用的数据

  • 因此,同一流中的命令保证按顺序执行(或同步执行,通常用作同义词)
  • 但是,不同流中的命令是独立的,可以并发运行
  • 因此,依赖关系仅为程序员所知,并使用流表示(以避免错误)
以下仅对应于计算能力为3.0或更低的设备(如quide中所述)。如果您想更多地了解compute capability 3.5对流调度行为的更改,请查看和相应的。在这一点上,我还想引用我找到HyperQ示例的线程:)

关于你的第二个问题:我不太明白你所说的“某个设备内存上的内核执行”或“涉及设备内存的内核执行”是什么意思,所以我把你的陈述缩减为:

内核执行需要对所有以前的内核和内存传输进行依赖性检查

最好是:

CUDA操作需要依赖项检查,以查看同一流中先前的CUDA操作是否已完成

我想你这里的问题是“开始执行”这个表达。这意味着仍然可以独立(即在不同的流上)启动内核,如果它们都开始执行,并且有足够的设备资源可用,那么将与以前的内核同时启动