【问题标题】:cuda warp size and control divergencecuda warp 大小和控制发散
【发布时间】:2015-03-25 09:45:10
【问题描述】:

我对以下问题有疑问:

假设我们有一张 9*7 的图片(x 方向 7 个像素,y 方向 9 个像素),假设 4*4 线程块和每个 warp 8 个线程,有多少个 warp 将具有控制散度?

如何在这里组织块和经线? 对于 x 或水平方向,我可以假设每行 2 个块。同样, 对于垂直方向,每列 3 个块。 但是,经线将如何组织?有人可以指出 warp 的线程 id,以及发生控制分歧的情况(线程 id 等)。

谢谢

【问题讨论】:

  • 这个问题的整个前提是有缺陷的。 cuda 中的 warp 大小总是 32.

标签: cuda gpu-warp


【解决方案1】:

假设,我们有一张 9*7 的图片(x 方向上 7 个像素,y 方向上 9 个像素),假设 4*4 线程块和每个 warp 8 个线程,有多少个 warp 将具有控制发散?

  1. 分歧是程序(代码)的属性,而不是块/扭曲布局本身的属性。如果您的算法在图像中的所有像素上运行相同,那么无论线程数及其组织如何,都不会出现任何分歧。如果您的算法在扭曲边界上分支,则也不会有分歧。因此,如果没有看到您的代码,您的问题在技术上是无法回答的。
  2. 如果您使用 16 个线程和每个 warp 8 个线程的块运行(这在 CUDA 硬件上物理上不可能:warp 由 32 个线程组成,并且它们的大小不可配置)然后您完全可以在没有 GPU 的情况下运行。这些数字太小了,无法从任何硬件加速中受益。

如何在这里组织块和经线?对于 x 或水平方向,我可以假设每行 2 个块。类似地,对于垂直方向,每列 3 个块。但是,经线将如何组织?

我将继续使用您的示例,并尝试提供线程 ID、块 ID、warp ID 的架构。请记住,这种布局实际上在 CUDA 硬件上是不可能的。

Image     Global Thread IDs      Block IDs              Local Thread IDs
□□□□□□□ | 00 01 02 03 04 05 06 | 00 00 00 00 00 00 00 | 00 01 02 03 04 05 06
□□□□□□□ | 07 08 09 10 11 12 13 | 00 00 00 00 00 00 00 | 07 08 09 10 11 12 13
□□□□□□□ | 14 15 16 17 18 19 20 | 00 00 01 01 01 01 01 | 14 15 00 01 02 03 04
□□□□□□□ | 21 22 23 24 25 26 27 | 01 01 01 01 01 01 01 | 05 06 07 08 09 10 11
□□□□□□□ | 28 29 30 31 32 33 34 | 01 01 01 01 02 02 02 | 12 13 14 15 00 01 02
□□□□□□□ | 35 36 37 38 39 40 41 | 02 02 02 02 02 02 02 | 03 04 05 06 07 08 09
□□□□□□□ | 42 43 44 45 46 47 48 | 02 02 02 02 02 02 03 | 10 11 12 13 14 15 00
□□□□□□□ | 49 50 51 52 53 54 55 | 03 03 03 03 03 03 03 | 01 02 03 04 05 06 07
□□□□□□□ | 56 57 58 59 60 61 62 | 03 03 03 03 03 03 03 | 08 09 10 11 12 13 14
----------------------------------------------------------------------------
Image     Global Warp IDs        Block IDs              Local Warp IDs
□□□□□□□ | 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00
□□□□□□□ | 00 01 01 01 01 01 01 | 00 00 00 00 00 00 00 | 00 01 01 01 01 01 01
□□□□□□□ | 01 01 02 02 02 02 02 | 00 00 01 01 01 01 01 | 01 01 00 00 00 00 00
□□□□□□□ | 02 02 02 03 03 03 03 | 01 01 01 01 01 01 01 | 00 00 00 01 01 01 01
□□□□□□□ | 03 03 03 03 04 04 04 | 01 01 01 01 02 02 02 | 01 01 01 01 00 00 00
□□□□□□□ | 04 04 04 04 04 05 05 | 02 02 02 02 02 02 02 | 00 00 00 00 00 01 01
□□□□□□□ | 05 05 05 05 05 05 06 | 02 02 02 02 02 02 03 | 01 01 01 01 01 01 00
□□□□□□□ | 06 06 06 06 06 06 06 | 03 03 03 03 03 03 03 | 00 00 00 00 00 00 00
□□□□□□□ | 07 07 07 07 07 07 07 | 03 03 03 03 03 03 03 | 01 01 01 01 01 01 01
----------------------------------------------------------------------------

以及发生控制分歧的情况(线程ID等)

如上所述,分歧是代码的属性而不是线程布局,没有代码就无法回答这个问题。

【讨论】:

  • 首先。非常感谢你的图表。 (由于
  • 我使用线性表示法,因为它比 (x, y) 更容易表示,并且更容易看到它们被分配到哪个扭曲。但这是一个双射:任何线性索引i 都可以表示为(x, y),反之亦然,使用i = x + y * xDim(x = i % xDim, y = i / xDim)。所以对于线程 4-6,它们的坐标是 (1, 0) 和 (1, 2),在块 0 内(没有坐标,因为你没有指定网格暗淡)。
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 2019-06-03
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 2019-01-14
  • 2016-12-08
相关资源
最近更新 更多