【问题标题】:conditional syncthreads & deadlock (or not)条件同步线程和死锁(或不)
【发布时间】:2013-03-04 10:24:29
【问题描述】:

跟进 Q 至:EarlyExitDroppedThreads

根据上面的链接,下面的代码应该是死锁的。
请解释为什么这不会死锁。 (费米上的 Cuda 5)

__device__ int add[144];
__device__ int result;

add<<<1,96>>>();  // the calling 

__global__ void add() {
 for(idx=72>>1; idx>0; idx>>=1) {
  if(thrdIdx < idx) 
   add[thrdIdx]+= add[thrdIdx+idx];
  else
   return;
  __syncthreads();
 }

 if(thrdIdx == 0)
  result= add[0];
}

【问题讨论】:

  • 你的启动配置是什么? (例如块 && 网格尺寸)
  • 你给出的代码不会接近编译,更不用说死锁了。顺便说一句,由于同步线程使用不当而导致的死锁是可能而不是保证。处理不当使用同步线程的正确方法是断定行为是undefined

标签: cuda


【解决方案1】:

从技术上讲,这是一个定义不明确的程序。

大多数,但不是全部(例如 G80 不支持),NVIDIA GPU 支持提前退出这种方式,因为硬件为每个块维护一个活动线程计数,这个计数用于屏障同步而不是初始线程计数为块。

因此,当到达你代码中的__syncthreads() 时,硬件不会等待任何已经返回的线程,程序运行不会死锁。

这种风格更常见的用法是:

__global__ void foo(int n, ...) {
  int idx = threadIdx.x + blockIdx.x * blockDim.x;
  if (idx >= n) return;
  ... // do some computation with remaining threads
}

重要提示:屏障计数是按 Warp 更新的(请参阅 here),而不是按线程更新。因此,您可能会遇到这样的情况,例如,只有少数(或零个)线程提前返回。这意味着屏障计数不会减少。但是,只要每个 warp 中至少有一个线程到达屏障,它就不会死锁。

因此,一般来说,您需要谨慎使用障碍。但具体来说,像这样的(简单)提前退出模式确实有效。

编辑:针对您的具体情况。

迭代 Idx==36:2 个活动 warp,因此屏障退出计数为 64。warp 0 中的所有线程都到达屏障,计数从 0 增加到 32。warp 1 中的 4 个线程到达屏障,计数从 32 增加到 64,并且经线 0 和 1 从屏障中释放。阅读上面的链接以了解为什么会发生这种情况。

Iteration Idx==18: 1 个活动 warp,因此屏障退出计数为 32。来自 warp 0 的 18 个线程到达屏障,计数从 0 增加到 32。满足屏障并释放 warp 0。

等等……

【讨论】:

  • 不要纠结于函数在做什么,而是看看它是如何做的。关于这个主题的其他 Q 似乎暗示“哦,你不能那样做”。根据我的经验,情况并非如此。这似乎确实可靠地工作,而不是未定义。我试图理解为什么,所以我可以更好地利用它。上面使用的 # 以 2 个 WARP 开头,然后迅速降为 1。 Thrds 沿途丢弃。第 2 经线中的 thrds,都看到了早期的回报。因此,当第一个 WARP 仍在运行时,他们看不到障碍。这似乎与您的“它不会陷入僵局”的评论不一致。你能详细说明一下吗?
  • 是的,活动线程计数,(那些不提前返回的),并且屏障计数是 2 个不同的#。你换个角度回答:只要每个活动warp中至少有一个活动线程,就不会死锁。
  • 这意味着在 warp-size 上操作的缩减也不会死锁。即在每个经纱中开始工作最多 32 次。最终将这 32 个线程减少到每个经纱中的至少一个线程仍在工作。
  • 是的,“warp-synchronous”方法很常见。 See my old presentation on the subject.
  • 那个链接对我不起作用。我想就是这样:developer.download.nvidia.com/assets/cuda/files/reduction.pdf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多