CUDA线程同步

时间:2012-07-15 15:12:55

标签: cuda

我对同步感到有点困惑。

  1. 使用__syncthreads可以同步块中的线程。这个, (使用__syncthreads)必须仅使用共享内存?要么 使用__syncthreads共享内存具有最佳性能?
  2. 通常,线程只能安全地相互通信 并且只有它们存在于同一个线程块中,对吧?所以为什么 我们不总是使用共享内存吗?因为它不够大? 而且,如果我们不使用共享内存,我们如何才能确保结果 对吗?
  3. 我有一个程序,有时运行正常(我得到结果)和 有时我会在不改变任何东西的情况下得到“纳”结果。可以吗? 同步问题?

3 个答案:

答案 0 :(得分:2)

  1. __syncthreads的使用不涉及共享内存,它只能确保块内的同步。但是,当您希望线程通过共享内存共享数据时,需要同步线程。

  2. 我们并不总是使用共享内存,因为它非常小,并且因为它在使用不当时会降低应用程序的速度。这是由于潜在的银行冲突在严重解决共享内存时的问题。此外,最近的体系结构(从2.0开始)在与缓存相同的硬件区域中实现共享内存。因此,一些经验丰富的CUDA开发人员建议不要使用共享内存,只依赖缓存机制。

  3. 可以。如果您想知道它是否是死锁,请尝试增加您正在使用的块数。如果它是死锁,你的GPU应该冻结。如果不是,请发布您的代码,我们会更容易回答;)

答案 1 :(得分:0)

__ syncthreads()和共享内存是独立的想法,你不需要一个人使用另一个。我想到的唯一使用__syncthreads()的要求是所有线程最终都必须到达代码中的那一点,否则你的程序就会挂起。

至于共享内存,是的,它可能是一个大小的问题,你不会看到它一直被使用。根据我的理解,共享内存分为所有块。例如,使用1kb的共享内存和100个块来启动内核将需要100kb,这超过了SM上可用的内容。

答案 2 :(得分:0)

  1. 虽然shared memory__syncthreads()是独立概念,但它们通常是齐头并进的。否则,如果线程独立运行,则无需使用__syncthreads()

  2. 两个方面限制了shared memory:1)的使用。 shared memory的大小有限2)。为了获得最佳性能,您需要在使用shared memory时避免银行冲突。

  3. 可能是由于缺少__syncthreads()。有时,使用不shared memory的{​​{1}}可能会导致不可预测的结果。