cuda:共享'常数'在线程块中

时间:2014-09-18 20:56:54

标签: cuda

我们正在尝试使用CUDA CFD代码,其中3D字段被分解为1D或2D线程块(来自3D字段的水平切片)。在许多情况下,一个块内的所有线程共享重复计算,该计算仅取决于高度,即它对于线程块内的所有线程是类似的。什么是优化这种情况的最佳方法(特别是如果重复计算是整个内核中最昂贵的计算)?是否有可能让一个线程进行计算,并与其余线程共享结果?

由于我有限的CUDA知识,我能想到的最好的是:if(threadIdx x和y为0)计算重复值,放入共享内存(?),所有线程都使用共享内存中的这个值他们的计算。这会有效吗,还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

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

一些选项,大致从“昂贵的计算并不是非常复杂”到“昂贵的计算非常复杂”:

  1. 什么都不做。只需在每个线程上计算它。如果计算不是很复杂,那么这可能是最快的,因为它允许编译器在同步过程中进行优化。
  2. 按照您的想法行事。计算一个线程,存储在共享内存中,同步,然后从该共享内存值读取。一个线程中的计算效率很低,并且会受到延迟限制,因此您可能需要相当多的块/多处理器来隐藏这种延迟。
  3. 并行化复杂的计算。也许在这个复杂的计算中存在一些并行性,你可以利用它。例如,如果您需要对少量值进行求和,则可以选择并行求和而不是连续求和。
  4. 预先计算即可。根据情况,在单独的内核中预先计算昂贵的数据可能更好。如果昂贵的计算非常昂贵,这个选项可能只是好的。这可能更快,因为内核的昂贵部分可能使用大量寄存器,这可能会限制内核其余部分的占用。
  5. 这一切都取决于您实际的昂贵计算。理想情况下,您已在问题中提供了更多信息!