CUDA并发内核执行行为和效率

时间:2017-04-08 01:31:55

标签: concurrency parallel-processing cuda

我还没有CUDA卡,现在我必须专注于OpenCL。所以......我想我最好问一下..

1。内核是按照我调用它们的顺序执行的吗?

如果我通过流0,B通过流1,通过流0,通过流1,通过流0调用A,则确保设备以A,B,C,D的顺序看到内核, E'

如果我通过流0调用内核A和B,然后通过流1调用C,那么B将阻塞C吗?我必须按顺序A,C,B调用它们以允许C与A和B同时运行?

2。如果我希望内核同时运行,是否存在任何停顿或处罚?

在AMD卡上,队列间的依赖性似乎非常昂贵(我可能会错。实际上我希望我错了。但是没有人可以告诉我我们是对还是不对。 ) 如果我有内核A,B和C,而A和B是独立的,C依赖于A和B.在AMD卡上,如果让D等待A或B,将会有很大的延迟,这使得同步执行很多几乎所有情况都会更快。

我现在理解的是,CUDA卡只有一个计算队列。也就是说,我可以表达依赖于我调用内核而不是像AMD卡上的事件那样的顺序。它会更有效甚至免罚吗?

2 个答案:

答案 0 :(得分:1)

这取决于您创建的命令队列。如果它是一个有序队列,那么按照您提交的顺序按顺序执行它们。如果它是一个无序队列,那么运行时可能不按顺序执行它们,甚至可能同时执行它们。它不必。某些设备或驱动程序不支持无序队列,只是按顺序处理它们。

管理无序命令队列会移动主机应用程序的依赖负担;您需要使用事件对象来构建依赖图。

另一种(我认为更容易)获得并发执行的方法是使用多个(可能是有序的)命令队列。在每个中放置独立的工作,并允许运行时同时运行内核(每个内核一个)。它没有必要,但如果可以,它应该。

答案 1 :(得分:0)

  1. 在较新的设备上,来自不同流的内核将无序执行。我在问题中描述的行为只会发生在非常古老的架构中。

  2. 内核将尽快开始执行。在B等待A的情况下在不同的流中调用A和B与在同一个流中按顺序调用A和B没有任何明显的区别。