4

我已经为字符串匹配测试编写了一个程序,以测试性能与 cpu 的关系。

我只是调用内核<<<1,1>>>,一个块包含一个线程,执行时间是430ms,然后我用一个块两个线程<<<1,2>>>调用内核,执行时间是303ms,最后我调用内核<<<2,1><<,两个块和每个线程一个,时间仅为 430ms 的一半(即 215ms)。

块中的线程和经线有什么区别?是什么让一个包含两个线程的块比两个块一个线程慢?

4

1 回答 1

18

首先要说明的是,GPU 需要数百或数千个活动线程来隐藏架构固有的高延迟并充分利用可用的算术容量和内存带宽。在一个或两个块中使用一个或两个线程对代码进行基准测试完全是浪费时间。

第二点是没有“块中线程”这样的东西。线程基本上是在 32 个线程的 warp 中执行的。块由 1 个或多个经线和 1 个或多个块的网格组成。

当您使用一个线程启动包含单个块的网格时,您会启动 1 个扭曲。该经线包含 31 个被屏蔽的“虚拟”线程和一个活动线程。如果您使用两个线程启动单个块,您仍然会启动 1 个 warp,但现在单个 warp 包含 2 个活动线程。

当您启动两个各自包含一个线程的块时,会产生两个扭曲,每个扭曲都包含一个活动线程。因为所有调度和执行都是在每个 warp 的基础上完成的,所以您现在有两个独立的实体(warp),硬件可以独立调度和执行。这允许更多的延迟隐藏和更少的指令流水线停顿,因此代码运行得更快。

所以 TLDR 的答案是 1 块 = 1 条扭曲,2 块 = 2 条扭曲,后者不如前者那么次优。

于 2013-05-19T15:05:45.370 回答