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

use*_*002 2 cuda

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

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

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

tal*_*ies 14

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

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

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

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

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