线程束分化

  • 4 replies
  • 185 views
线程束分化
« 于: 十一月 02, 2022, 08:01:36 am »
想请教一下:N卡上的线程束分化,看cuda c编程权威指南里面提到,当出现线程束分化的时候,同一个线程束中,满足con的线程束会执行if指令,不满足的会等待,我想问的是,线程束在指令调度单元下,在一个周期内不都是执行的相同的指令吗,为何不满足的是等待呢?按自己的理解应该是不满足的也会执行该指令,只是该结果被某种GPU策略给丢弃了。不知道哪里理解的不对?谢谢

Re: 线程束分化
« 回复 #1 于: 十一月 02, 2022, 12:28:29 pm »
想请教一下:N卡上的线程束分化,看cuda c编程权威指南里面提到,当出现线程束分化的时候,同一个线程束中,满足con的线程束会执行if指令,不满足的会等待,我想问的是,线程束在指令调度单元下,在一个周期内不都是执行的相同的指令吗,为何不满足的是等待呢?按自己的理解应该是不满足的也会执行该指令,只是该结果被某种GPU策略给丢弃了。不知道哪里理解的不对?谢谢

当一个warp的内部出现divergent branch的时候,例如你用if(cond){body1} else {body2}的方式,那么在较新的卡上,支持独立线程调度的时候,有可能warp中的满足cond的线程们在执行条件body1的时候,剩下的线程们并不等待,也可能会执行body2的。

其次就是,如果body1和body2的跳转没有被编译成分支,而是带有@p body1的这样的指令序列的时候,则对于warp中的所有线程都会执行body1,但是不满足p为真的那些线程,也就是类似@false XXXX,这里的XXXX的执行效果会被丢弃。(丢弃是指,普通计算不写入结果;访存指令不evaluate地址,不执行实际上的存储器访问。所以是安全的。)

所以你之前的理解在某种程度上是对的。

Re: 线程束分化
« 回复 #2 于: 十一月 03, 2022, 07:43:39 am »
当一个warp的内部出现divergent branch的时候,例如你用if(cond){body1} else {body2}的方式,那么在较新的卡上,支持独立线程调度的时候,有可能warp中的满足cond的线程们在执行条件body1的时候,剩下的线程们并不等待,也可能会执行body2的。

其次就是,如果body1和body2的跳转没有被编译成分支,而是带有@p body1的这样的指令序列的时候,则对于warp中的所有线程都会执行body1,但是不满足p为真的那些线程,也就是类似@false XXXX,这里的XXXX的执行效果会被丢弃。(丢弃是指,普通计算不写入结果;访存指令不evaluate地址,不执行实际上的存储器访问。所以是安全的。)

所以你之前的理解在某种程度上是对的。

想问下支持独立线程调度的卡指的是SIMT工作模式的卡吗?也就是说在新卡上可能存在这种情况:一个wrap里所有线程执行的指令可能并不一样?

Re: 线程束分化
« 回复 #3 于: 十一月 03, 2022, 09:58:00 am »
想问下支持独立线程调度的卡指的是SIMT工作模式的卡吗?也就是说在新卡上可能存在这种情况:一个wrap里所有线程执行的指令可能并不一样?

是从计算能力7.0开始引入的东西,不是SIMT。你可以参考一下手册的这里:

https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#independent-thread-scheduling-7-x

Re: 线程束分化
« 回复 #4 于: 十一月 04, 2022, 07:30:23 am »
是从计算能力7.0开始引入的东西,不是SIMT。你可以参考一下手册的这里:

https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#independent-thread-scheduling-7-x

非常感谢