是";“放松”;CUDA中是否可以同步块中的线程?

是";“放松”;CUDA中是否可以同步块中的线程?,cuda,synchronization,Cuda,Synchronization,我知道什么是\uu syncthreads(),我想做一点不同的事情: __global__ void kernel() { __shared__ array[1024]; some other declarations load some data into array label1: do some other independent calculations label2: use data from array ... } 所以我可以做\uu syncthr

我知道什么是
\uu syncthreads()
,我想做一点不同的事情:

__global__ void kernel()
{
  __shared__ array[1024];
  some other declarations

  load some data into array
label1:
  do some other independent calculations

label2:
  use data from array
  ...
}
所以我可以做
\uu syncthreads()
;在label2。它的语义是,只有当所有线程都达到
label2
时,线程才能超越
label2


我实际需要的是确保当所有其他线程都到达
label1
时,线程可以超越
label2
。这样的障碍比较弱,我希望它能减少对我程序的阻碍。有没有像这样的松弛屏障?

只有当块的大小等于扭曲(或一半)时,才可以安全地忽略
\u syncthreads()
。这种技术被称为“扭曲同步编程”。由于一个warp中的所有线程都同时执行,因此可以确保它们在某个点上已经执行了先前的指令。在其他情况下,您只能假设一个块中的所有线程都经过内核的某个部分——这是一个非常危险的假设

当第一次到达
label2
时,您如何确保所有线程都将通过
label1
?如何定义“第一个线程”?我大致了解GPU的工作原理,但当然不能完全确定。GPU接受线程0-31,为它们执行一个操作。若操作需要一个以上的周期,GPU将为线程32-63执行一个操作。。。因此,内存读取后的额外计算越多,就越有可能有足够的周期插入其他线程的执行。如果内存读取位于内核的开头,我想它们将彼此非常接近地开始,并在多次循环后完成,但也会同时完成。使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu共享
内存原子可以构造一个“有条件的”
\uuuuuuuuuuuuuuuuuuuu。如果没有完整的示例或测试用例,我不清楚它是否会比正常发布
\uuu syncthreads()
带来更多好处,按照您的要求,没有内置的条件功能。使用共享内存本身就需要使用
\u syncthreads()
进行正确的初始化。由于线程在初始化期间不会有太大的进展,或者初始化成本可以在多次使用homebuild sync构造时摊销,所以它可能仍然会带来净收益。但是,与每个SM运行多个块以使
\uuu syncthreads()
便宜的简单解决方案相比,它有很多摊销成本。PTX通过未在CUDA C级别公开的指令为生产者-消费者方案提供了相关机制。但我不能马上看出这是如何容易地在这里实现的,因为消费者仍然需要等待所有其他消费者。在投票否决我的答案之前,请阅读原始(未编辑)问题。如果你仍然不同意,用评论告诉我有什么问题。我相信在我编辑这个问题之前,它被否决了。原始版本的要求与我的编辑相同,但以间接/复杂的方式。因此,这不是问题的答案。(但不是我的反对票)