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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了块中的线程和warp(32个线程)之间有什么区别?相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

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

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

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

以上是关于块中的线程和warp(32个线程)之间有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

CUDA中的warp和bank的机制是啥?

为啥要费心去了解 CUDA Warps?

CPU 超过 GPU

经线中的线程是不是同步执行指令?块中的线程呢?

CUDA 扭曲和每个块的最佳线程数

64位线程分离共享内存最小化bank冲突的策略