我对同步感到有点困惑。
__syncthreads
可以同步块中的线程。这个,
(使用__syncthreads
)必须仅使用共享内存?要么
使用__syncthreads
共享内存具有最佳性能?答案 0 :(得分:2)
__syncthreads
的使用不涉及共享内存,它只能确保块内的同步。但是,当您希望线程通过共享内存共享数据时,需要同步线程。
我们并不总是使用共享内存,因为它非常小,并且因为它在使用不当时会降低应用程序的速度。这是由于潜在的银行冲突在严重解决共享内存时的问题。此外,最近的体系结构(从2.0开始)在与缓存相同的硬件区域中实现共享内存。因此,一些经验丰富的CUDA开发人员建议不要使用共享内存,只依赖缓存机制。
可以。如果您想知道它是否是死锁,请尝试增加您正在使用的块数。如果它是死锁,你的GPU应该冻结。如果不是,请发布您的代码,我们会更容易回答;)
答案 1 :(得分:0)
__ syncthreads()和共享内存是独立的想法,你不需要一个人使用另一个。我想到的唯一使用__syncthreads()的要求是所有线程最终都必须到达代码中的那一点,否则你的程序就会挂起。
至于共享内存,是的,它可能是一个大小的问题,你不会看到它一直被使用。根据我的理解,共享内存分为所有块。例如,使用1kb的共享内存和100个块来启动内核将需要100kb,这超过了SM上可用的内容。
答案 2 :(得分:0)
虽然shared memory
和__syncthreads()
是独立概念,但它们通常是齐头并进的。否则,如果线程独立运行,则无需使用__syncthreads()
。
两个方面限制了shared memory
:1)的使用。 shared memory
的大小有限2)。为了获得最佳性能,您需要在使用shared memory
时避免银行冲突。
可能是由于缺少__syncthreads()
。有时,使用不shared memory
的{{1}}可能会导致不可预测的结果。