【问题标题】:what's the difference between a thread in a block and a warp(32 threads)?块中的线程和warp(32个线程)有什么区别?
【发布时间】:2013-05-19 14:14:47
【问题描述】:

我写了一个字符串匹配测试的程序,来测试性能与cpu的关系。

我只是通过<<<1,1>>>调用内核,一个block包含一个线程,执行时间是430ms,然后我用一个block两个线程<<<1,2>>>调用内核,执行时间是303ms,最后我通过<<<2,1><<调用内核,两个block一个线程,时间刚好是430ms的一半(也就是215ms)。

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

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 2021-05-23
      • 1970-01-01
      • 2019-08-22
      • 2012-07-11
      • 2019-03-13
      相关资源
      最近更新 更多