- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经编写了一个字符串匹配测试程序,来测试性能与 CPU 的对比。
我只是通过 <<<1,1>>>
调用内核,一个block包含一个线程,执行时间430ms,然后我用一个block两个线程<<<1,2>>>
调用内核,执行时间为303ms,最后通过<<<2,1><<
调用内核, 两个块和一个线程,时间只是 430ms 的一半(即 215ms)。
块中的线程和经纱有什么区别?是什么让一个包含两个线程的块比两个块每个一个线程慢?
最佳答案
首先要说明的是,GPU 需要数百或数千个事件线程来隐藏架构固有的高延迟并充分利用可用的算术容量和内存带宽。在一两个块中使用一两个线程对代码进行基准测试完全是在浪费时间。
第二点是没有“块中的线程”这样的东西。线程基本上是在 32 个线程的扭曲中执行的。块由 1 个或多个经线和 1 个或多个块的网格组成。
当您使用一个线程启动包含单个块的网格时,您将启动 1 个扭曲。该经线包含 31 条被屏蔽的“虚拟”线和一条事件线。如果您使用两个线程启动单个块,您仍然会启动 1 个扭曲,但现在单个扭曲包含 2 个事件线程。
当您启动两个包含单个线程的块时,会产生两个扭曲,每个扭曲包含 1 个事件线程。因为所有的调度和执行都是在每个 warp 的基础上完成的,所以你现在有两个独立的实体 (warp),硬件可以独立地调度和执行它们。这允许更多的延迟隐藏和更少的指令流水线停顿,因此代码运行得更快。
所以 TLDR 的答案是 1 个块 = 1 个扭曲,2 个块 = 2 个扭曲,后者不如前者那么次优。
关于cuda - block 中的线程和经线(32 个线程)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16635587/
我是一名优秀的程序员,十分优秀!