Chinese, Simplified subtitles

← cs344_unit5_35_q_switch语句和线程发散第1部分

Get Embed Code
2 Languages

Showing Revision 9 created 05/17/2013 by Michael Xiao.

  1. 其实容易构建这种内核。
  2. 例如,我们用一个switch带有32或更多case的语句。
    如果一个warp中的每个线程要切换到不同的情况,
  3. 以及每个情况都要花一样多的执行时间,
  4. 那么这部分的内核运行会比一个warp中所有线程
    都切换到同一情况要慢32倍。
  5. 好了,让我们用一个小测验来探究这一点吧。
  6. 所以我要给你一堆switch 语句,我们要假装
  7. 它们在一个内核并且所有的这些Switch 语句
    的情况都会花费一样多的时间。
  8. 好吧,所以我来做第一个示例来说明我在找的格式。
  9. 在这里,我们有一个switch 语句,这是在内核代码中。
  10. 它切换线程索引.x、 mod 32,
  11. 而这意味着你会得到从 0 到 31的数字。
  12. 我只是用这种短切符号来表明我得到了从0到31的情形。
  13. 我想你认为所有这些情况都会使用同样多的时间。
  14. 然后还有一些更多的代码,
    而稍后我要实际启动这个内核,
  15. 我要在这样的配置中去启动它。
  16. 它会有一个1024个线程的单线程块。
  17. 所以我想问你的问题是,减速时多少?
  18. 它是 1x,意思是根本就没有减速吗?它是32 x,
    意思一个30的一个因子?
  19. 你知道,假设所有这些情况下都花了同样多的时间,
    它将因为分支发散而在运行这一节代码时慢 32 倍吗?
  20. 这是怎么回事?所以我就给你一系列这些样的例子,
    使用这种速记表示法,
  21. 我想让你想想由于线程发散,一个warp中的不同线程,
  22. 你将得到的减速是多少。
  23. 第一个的答案,这就是我们一直在讨论的某种例子。
  24. 好的,每个线程要去一个不同的路径。
  25. 在warp中的每个线程将会有不同的线程索引值,
  26. 这些值将从 0 到 31,所以每个单个线程将采取不同的路径,
  27. 这就意味着warp必须依次激活每个线程,
    运行那个特定的case语句,
  28. 停用该线程,激活另一个线程,运行那个case语句等等。
  29. 所以,这将导致最大减速 32 倍。
  30. 这里是我们另一个例子,我尝试要做的是用黑色突出显示这些例子
  31. 中和我给出的第一个例子中的代码不一样的部分。
  32. 所以在这个例子中我们同样启动一个有1024线程的内核,
    而现在我们我们得到了从0到63的情况,
  33. 我们要使用线程索引并且以64而不是32对它进行模运算,。
  34. 你的工作是找出这种减速。
  35. 一个二维的内核会怎么样呢?在这里,我要用一些速记来表示
  36. 我要启动一个在 X 方向有 64 个线程和
    Y 方向有 16 个线程的线程块,
  37. 再用一个单线程块,然后我要去切换这个线程的 Y 索引。
  38. 下一步,另一个例子是我要像之前一样,
    去切换这个线程的 Y 索引
  39. 只是这次,我启动了有16x16个线程的线程块。