CUDA线程同步

CUDA线程同步,cuda,Cuda,我对同步有点困惑 使用\uuu syncthreads可以同步块中的线程。这, (使用\uu syncthreads)必须仅使用共享内存?或 将共享内存与\uuu syncthreads一起使用具有最佳性能 通常,只有在以下情况下,线程才能安全地相互通信: 只有当它们存在于同一个线程块中时,对吗?那么,为什么 我们不总是使用共享内存吗?因为它不够大? 而且,如果我们不使用共享内存,我们如何确保结果 你说得对吗 我有一个程序,有时运行正常(我得到结果),并且 有时我得到的结果是“nan”,但没有改

我对同步有点困惑

  • 使用
    \uuu syncthreads
    可以同步块中的线程。这, (使用
    \uu syncthreads
    )必须仅使用共享内存?或 将共享内存与
    \uuu syncthreads
    一起使用具有最佳性能
  • 通常,只有在以下情况下,线程才能安全地相互通信: 只有当它们存在于同一个线程块中时,对吗?那么,为什么 我们不总是使用共享内存吗?因为它不够大? 而且,如果我们不使用共享内存,我们如何确保结果 你说得对吗
  • 我有一个程序,有时运行正常(我得到结果),并且 有时我得到的结果是“nan”,但没有改变任何东西。是吗 同步问题
  • __syncthreads()和共享内存是独立的概念,您不需要一个来使用另一个。在我看来,使用_syncthreads()的唯一要求是所有线程最终都必须到达代码中的某个点,否则程序就会挂起

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

  • 虽然
    共享内存
    \uu syncthreads()
    是两个独立的概念,但它们通常是齐头并进的。否则,如果线程独立运行,则无需使用
    \uu syncthreads()

  • 有两个方面限制了共享内存的使用:1)。
    共享内存的大小受限制(2)。为了获得最佳性能,在使用
    共享内存时需要避免银行冲突

  • 这可能是由于缺少
    \uuu syncthreads()
    。有时,在不使用
    \uu syncthreads()
    的情况下使用
    共享内存
    ,可能会导致不可预知的结果

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

  • 我们并不总是使用共享内存,因为它非常小,而且在使用不当时会减慢应用程序的速度。这是由于在对共享内存进行错误寻址时,可能会发生银行冲突。此外,最近的体系结构(从2.0开始)在与缓存相同的硬件区域中实现共享内存。因此,一些经验丰富的CUDA开发人员建议不要使用共享内存,而只依赖缓存机制

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


  • 共享内存通常涉及
    \u syncthreads
    以确保块中的其他线程可以使用数据。注意:好的,谢谢!不幸的是,我无法发布代码。我正在使用最大数量的块和线程,运行正常。现在,如果我更改代码中的某些参数,然后运行它,它会显示nan值或不运行。如果我返回到原始值,它仍会显示nan或不运行!它应该使用原始(测试过的)值运行(我必须提到pycuda中的所有这些值)。但是,如果它使用一些测试值运行,可能是您的CUDA驱动程序造成的。你最近换了吗?请检查我没有换司机。谢谢