了解CUDA依赖性检查

时间:2013-02-26 08:01:04

标签: cuda

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

  

对于支持并发内核执行且具有计算能力3.0的设备   或更低,任何需要依赖性检查以查看流内核的操作   发布完成:

     

‣只有当所有先前内核的所有线程块都从其中启动时才能开始执行   CUDA上下文中的流已经开始执行;

     

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

我在这里很丢失。什么是依赖性检查?我是否可以说某些设备内存上的内核执行需要对涉及相同设备内存的所有先前内核或内存传输进行依赖性检查?如果这是真的(可能不是真的),则此依赖性检查会根据上述语句阻止所有后续内核与任何其他流,因此之后不会发生异步或并发执行,这似乎不正确。

任何解释或阐述都将不胜感激!

1 个答案:

答案 0 :(得分:4)

首先,我建议您访问nvidia的webinar-site并观看有关Concurrency& amp;的网络研讨会。流。

此外,请考虑以下几点:

    发布到同一个流的
  • 命令被视为依赖
      

    e.g。你会在对某些数据进行记忆复制之后将内核插入到流中   内核将进行访问。内核“取决于”对可用的数据。

  • 因此,
  • 相同流中的命令可以保证顺序执行(或同步执行,通常用作同义词)
  • 不同流中的命令是独立的,可以并发运行
  • 所以依赖关系仅为程序员所知,并使用流表示(以避免错误)!

以下内容仅对应于计算能力为3.0或更低的设备(如quide中所述)。如果您想了解有关使用计算功能3.5对流调度行为所做的更改的更多信息,请查看HyperQ和相应的example。此时我还想引用我发现HyperQ示例的this线程:)

关于你的第二个问题:我不太明白你的意思是“某些设备内存上的内核执行”或“涉及设备内存的内核执行”,所以我将你的陈述减少到:

  

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

更好的是:

  

CUDA操作需要进行相关性检查,以确定相同流中的先前CUDA操作是否已完成。

我认为你的问题在于“开始执行”一词。这意味着仍然可以独立(即在不同的流上)内核启动,将与先前的内核并发,前提是它们已经开始执行足够的设备资源可用。