线程计数对bar.arrive PTX屏障同步指令意味着什么?

时间:2017-06-11 18:38:14

标签: multithreading cuda ptx

PTX文档中提到here,可以使用bar.syncbar.arrive屏障同步说明,如下所示:

bar.sync      a{, b};
bar.arrive    a, b;

哪里

  

源操作数a将逻辑屏障资源指定为立即数或0到15的寄存器。操作数b指定参与屏障的线程数。

它还显示了使用这些说明建立生产者 - 消费者模型的示例:

// Producer code places produced value in shared memory.
st.shared [r0],r1; 
bar.arrive 0,64;
...

// Consumer code, reads value from shared memory 
bar.sync 0,64; 
ld.shared r1,[r0];
...

我在b中没有达到操作数bar.arrive的目的。虽然bar.sync中的此类操作数可用于控制屏障中涉及的线程数并等到线程计数达到,但bar.arriveBlogPost的使用并不清楚。

1 个答案:

答案 0 :(得分:2)

当所有线程都到达障碍时会发生两件事:

  1. 允许所有等待的线程越过屏障。
  2. 屏障已重新初始化,因此可以再次使用。
  3. 您可能只考虑1.,这只能在bar.sync指令处发生。因此很明显,bar.sync需要知道参与障碍的线程数。但是,屏障也可以在bar.arrive释放,因此也需要知道参与线程的数量。

    话虽如此,如果参与的warp甚至线程对所涉及的线程数不一致,那么它是无证的。这可以被视为一个大胆的好奇心的机会,通过逆向工程找到可能的新(和不支持!)同步结构。