0

我对同步有点困惑。

  1. 使用__syncthreads你可以在一个块中同步线程。这个,(使用__syncthreads)必须只与共享内存一起完成?或者使用__syncthreads具有最佳性能的共享内存?
  2. 通常,只有当且仅当它们存在于同一个线程块中时,线程才能安全地相互通信,对吗?那么,为什么我们不总是使用共享内存呢?因为不够大?而且,如果我们不使用共享内存,我们如何确保结果是正确的?
  3. 我有一个有时运行正常的程序(我得到结果),有时我得到'nan'结果而不改变任何东西。这可能是同步的问题吗?
4

3 回答 3

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

  2. 我们并不总是使用共享内存,因为它非常小,而且如果使用不当,它会降低您的应用程序的速度。这是由于在错误地处理共享内存时潜在的银行冲突。此外,最近的架构(从 2.0 开始)在与缓存相同的硬件区域中实现共享内存。因此,一些经验丰富的 CUDA 开发人员建议不要使用共享内存,而仅依赖缓存机制。

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

于 2012-07-15T16:17:25.033 回答
0

__syncthreads() 和共享内存是独立的想法,你不需要一个使用另一个。我想到的使用 __syncthreads() 的唯一要求是所有线程最终必须到达代码中的点,否则您的程序将简单地挂起。

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

于 2012-07-15T15:24:45.153 回答
0
  1. shared memory和虽然__syncthreads()是独立的概念,但它们往往是齐头并进的。否则,如果线程独立运行,则无需使用__syncthreads().

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

  3. 这可能是由于缺乏__syncthreads(). 有时,使用shared memorywithout__syncthreads()可能会导致不可预知的结果。

于 2012-07-15T16:06:27.330 回答