我还没有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卡上的事件那样的顺序。它会更有效甚至免罚吗?
答案 0 :(得分:1)
这取决于您创建的命令队列。如果它是一个有序队列,那么按照您提交的顺序按顺序执行它们。如果它是一个无序队列,那么运行时可能不按顺序执行它们,甚至可能同时执行它们。它不必。某些设备或驱动程序不支持无序队列,只是按顺序处理它们。
管理无序命令队列会移动主机应用程序的依赖负担;您需要使用事件对象来构建依赖图。
另一种(我认为更容易)获得并发执行的方法是使用多个(可能是有序的)命令队列。在每个中放置独立的工作,并允许运行时同时运行内核(每个内核一个)。它没有必要,但如果可以,它应该。
答案 1 :(得分:0)
在较新的设备上,来自不同流的内核将无序执行。我在问题中描述的行为只会发生在非常古老的架构中。
内核将尽快开始执行。在B等待A的情况下在不同的流中调用A和B与在同一个流中按顺序调用A和B没有任何明显的区别。