关于在cuda中组织线程

about organizing threads in cuda

本文关键字:线程 cuda      更新时间:2023-10-16

一般问题:线程数必须等于我想处理的元素的大小?例如:如果我有矩阵M[a][b]。我必须分配(aXb)线程,或者我可以分配更多的线程比我需要(超过ab)?因为关注元素aXb+1的线程会把我们扔出去,不是吗?或者解决方案是设置一个条件(仅当在(ab)范围内)?

具体问题:设M[x][y]矩阵,x行y列。考虑1000 <= x <= 300000, y <= 100。我如何组织线程,使它对x和y的每个输入都是通用的,我希望每个线程都关注矩阵中的一个元素。CC = 2.1谢谢!

一般答案:这取决于问题。

在大多数情况下,将问题自然地一对一映射到线程网格是可以开始的,但是您要记住的是:

  1. 实现高入住率
  2. 最大化GPU资源使用和内存吞吐量
  3. 处理有效数据

有时可能需要使用单个线程处理多个元素,或者使用多个线程处理单个元素。例如,您可以想象需要应用于元素数组的一系列独立操作A、B和C。您可以运行三个不同的内核,但更好的选择可能是分配网格,使其包含的线程数量是元素数量的三倍,并通过网格的一个维度(或其他任何维度)来区分操作。另一方面——你可能有一个问题,可能需要最大化共享内存的使用(例如转换图像)——你可以使用16个线程的块来处理5x5的图像窗口,其中每个线程将计算每个2x2切片的一些统计信息。

选择权在你——最好的建议并不总是随波逐流。尝试不同的方法,选择最有效的方法。