块中的线程和warp(32个线程)之间有什么区别?

时间:2013-05-19 14:14:48

标签: cuda

我已经编写了一个字符串匹配测试程序,用于测试性能与cpu。

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

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

1 个答案:

答案 0 :(得分:14)

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

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

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

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

因此TLDR答案是1个块= 1个warp,2个块= 2个warp,后者不如前者更不理想。