cuda经纱尺寸和控制发散

cuda经纱尺寸和控制发散,cuda,gpu-warp,Cuda,Gpu Warp,我对以下问题有疑问: 假设我们有一张9*7的图片(x方向7个像素,y方向9个像素),假设每个扭曲块有4*4个线程和8个线程,那么有多少扭曲具有控制散度 在这里如何组织块和扭曲? 对于x或水平方向,我可以假设每行2个块。类似地, 对于垂直方向,每列3个块。 但是,这些扭曲将如何组织?有人能指出翘曲的线程ID,以及发生控制分歧的情况(这些情况的线程ID等) 谢谢 假设我们有一张9*7的图片(x方向7个像素,y方向9个像素),假设每个扭曲块有4*4个线程和8个线程,那么有多少扭曲具有控制散度 散度是程

我对以下问题有疑问:

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

在这里如何组织块和扭曲? 对于x或水平方向,我可以假设每行2个块。类似地, 对于垂直方向,每列3个块。 但是,这些扭曲将如何组织?有人能指出翘曲的线程ID,以及发生控制分歧的情况(这些情况的线程ID等)

谢谢

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

  • 散度是程序(代码)的属性,而不是块/扭曲布局本身的属性。如果您的算法在图像中的所有像素上运行相同,那么无论线程的数量和组织如何,都不会有任何差异。如果您的算法在扭曲边界上分支,则也不会出现发散。因此,没有看到您的代码,您的问题在技术上是无法回答的
  • 如果您使用16个线程的块运行,每个扭曲8个线程(这在CUDA硬件上是不可能的:扭曲由32个线程组成,其大小是不可配置的),那么您完全可以在没有GPU的情况下运行。这些数字太小,无法从任何硬件加速中获益
  • 在这里如何组织块和扭曲?对于x或水平方向,我可以假设每行2个块。同样,对于垂直方向,每列3个块。但是,这些扭曲将如何组织

    我将坚持您的示例,并尝试提供线程ID、块ID和扭曲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,它们的坐标是块0内的(1,0)和(1,2)(因为没有指定网格尺寸,所以块0没有坐标)。这个问题的整个前提是有缺陷的。cuda中的扭曲大小始终是32。