2016-12-05 25 views
0

CUDA编程指南分为以下的说:CUDA线程是否以O(n)操作的锁步执行?

的经执行一次一个共同的指令,所以,当经纱的所有32个线程的执行路径上同意达到最高效率。如果warp的线程通过依赖于数据的条件分支发散,则warp会连续执行所采用的每个分支路径,禁用不在该路径上的线程,并且当所有路径完成时,线程会聚到相同的执行路径。

我在想,因为一个共同的指令在一个时间锁步。

  1. 那么在没有分支并且每个线程需要计算O(n)操作的情况下会发生什么?
  2. 如果他们操作的数据值较小,那么warp中的某些线程是否会在其他线程之前完成?
  3. 如果某些线程在其他线程之前完成,它们保持空闲状态,直到其他线程完成?
+0

指南指的是O(1)(至少在理论上)的具体机器指令。您的O(n)操作由机器指令组成。为了在其他人之前进行经纱整理,您需要为他们提供不同的数据。这只适用于一个分支(除非我在这里错了,而你有一个反例)。 – Drop

+0

这正是我想要发现的;如果他们用不同的数据喂食,会在别人之前完成线程处理? – John

+0

我的观点是:你不能在没有分支的情况下饲喂不同的东西(即(1)中的假设是错误的)。并且在分支的情况下,每条路径长度相同并且被序列化。无论如何,线程同时完成。 – Drop

回答

3

warp中的每条指令都是以锁步执行的。下一条指令只能在前一条指令完成时才能读取。 如果一条指令需要不同线程的时间量(例如,一个线程从缓存中加载数据,而另一个线程等待全局内存读取),则所有线程都必须等待。

这就是说,我不知道任何单一的指令具有复杂性O(n)。您可能指的是由warp中的每个线程执行的大小为n的循环。与任何其他控制流构造一样,Loop具有条件跳转。早期退出循环的线程将被屏蔽并等待线程仍在循环中。当所有线程都表示他们想要退出时,它们会汇合,并且以下操作再次以完美的同步进行。

相关问题