2016-11-05 36 views
-1

一般问题:线程的数量必须等于我想要处理的元素的大小?例如:如果我有矩阵M [a] [b]。我必须分配(aXb)线程,或者我可以分配比我需要的更多的线程(比ab更多)?因为专注于元素aXb + 1的线程会将我们抛出,不是吗?或者解决方案是放置一个条件(只有在范围(ab))?关于在cuda中组织线程

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

+0

您可以分配更多,或者甚至可以分配更少。任何一种方法都可以工作。如果你分配的线程多于所需的线程数,你的内核应该包含一个条件测试来确保每个线程都在有效的数据上运行。如果你分配的线程少于所需的线程数,你的内核应该包含[某种类型的循环](https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/ )涵盖所有数据项目。 –

回答

1

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

在大多数情况下,自然有人对一个问题线程的网格的映射是好的下手,但你要记住的是:

  1. 实现高入住率。
  2. 最大限度地提高GPU资源使用率和内存吞吐量。
  3. 使用有效数据。

有时它可能需要使用单线程来处理许多元素或许多线程来处理单个元素。例如,您可以想象需要应用于元素数组的一系列独立操作A,B和C.你可以运行三个不同的内核,但是分配网格可能会比元素多三倍,并且通过网格(或其他)的一个维度区分操作。另一方面,您可能会遇到一个问题,可能会最大限度地利用共享内存(例如转换图像) - 您可以使用16个线程块来处理5x5图像窗口,其中每个线程将计算每个2x2切片的统计信息。

选择是你的 - 最好的建议并不总是明显的。尝试不同的方法并选择最适合的方法。