cuda:共享';常数';中间螺纹块

cuda:共享';常数';中间螺纹块,cuda,Cuda,我们正在使用CUDA CFD代码进行实验,在该代码中,三维场被分解为一维或二维螺纹块(三维场的水平切片)。在许多情况下,一个块内的所有线程共享一个循环计算,该计算仅取决于高度,即,一个线程块内的所有线程都类似。优化这种情况的最佳方法是什么(特别是如果循环计算是整个内核中最昂贵的计算)?是否有可能让一个线程进行计算,并与其他线程共享结果 以我有限的CUDA知识,我能想到的最好的方法是:如果(threadIdx x和y为0)计算循环值,放入共享内存(?),所有线程在计算中都使用共享内存中的该值。这是

我们正在使用CUDA CFD代码进行实验,在该代码中,三维场被分解为一维或二维螺纹块(三维场的水平切片)。在许多情况下,一个块内的所有线程共享一个循环计算,该计算仅取决于高度,即,一个线程块内的所有线程都类似。优化这种情况的最佳方法是什么(特别是如果循环计算是整个内核中最昂贵的计算)?是否有可能让一个线程进行计算,并与其他线程共享结果


以我有限的CUDA知识,我能想到的最好的方法是:如果(threadIdx x和y为0)计算循环值,放入共享内存(?),所有线程在计算中都使用共享内存中的该值。这是有效的,还是有更好的方法?

有很多方法可以做你想做的事情,但是如果没有更多的信息,就不可能说哪种方法最好

一些选项大致从“昂贵的计算并不十分复杂”到“昂贵的计算极其复杂”:

  • 什么都不做。只要在每个线程上计算它。如果计算不是很复杂,这可能是最快的,因为它允许编译器在整个同步过程中进行优化
  • 照你的想法去做。在一个线程上计算,存储在共享内存中,同步,然后从共享内存中读取值。一个线程中的计算效率很低,并且会受到延迟限制,因此您可能需要相当多的块/多处理器来隐藏此延迟
  • 将复杂的计算并行化。也许在这个复杂的计算中有一些并行性,你可以利用它。例如,如果需要对少量值进行求和,则可以选择并行求和,而不是顺序求和
  • 预计算。根据具体情况,最好在单独的内核中预计算昂贵的数据。只有当昂贵的计算非常昂贵时,此选项才可能有效。这可能会更快,因为内核的昂贵部分可能会使用大量寄存器,这可能会限制内核其余部分的占用 这一切都归结于你昂贵的计算到底是什么。理想情况下,你应该在问题中提供更多的信息