CUDA 中 warp 调度程序的指令发布时间延迟是多少?

Posted

技术标签:

【中文标题】CUDA 中 warp 调度程序的指令发布时间延迟是多少?【英文标题】:What is the instruction issue time latency of the warp schedulers in CUDA? 【发布时间】:2013-08-29 00:35:09 【问题描述】:

我的印象是计算能力 1.x GPU 中的(单个)warp 调度程序每 4 个周期为每个 warp 发出一条指令,并且由于算术流水线的延迟是 24 个周期,因此可以完全隐藏它任何时候有 6 个活动经线。

对于计算能力 2.1 GPU,编程指南提到“在每个指令发出时间,每个调度程序都会发出两条独立的指令”,而 How does the CUDA warp scheduler issue 2 instructions at a time for a warp? 的帖子建议每个调度程序可以在每个周期的每个 warp 发出一条指令。

那么,warp 调度程序的确切延迟是多少?每个warp每多少个周期发出一条指令?是否同时向任何活动和准备好的经线发出不同的指令 (MIMD)?

【问题讨论】:

这个和C其实没什么关系,我把标签去掉了。 删除标签 【参考方案1】:

是的,有 one warp scheduler in a cc 1.x SM,对于整数和单精度浮点运算,它将在 4 个时钟周期内发出一条指令来服务整个 warp。

有two warp schedulers in a cc 2.x SM。摘自编程指南,我们看到这 2 个调度程序的行为在 cc 2.0 和 cc 2.1 之间略有不同:

在每个指令发出时间,每个调度器发出:

•计算能力2.0设备的一条指令,

•计算能力2.1设备的两条独立指令,

对于一些准备好执行的warp,如果有的话。第一个调度器负责具有奇数 ID 的经线,第二个调度器负责具有偶数 ID 的经线。请注意,当一个调度器发出双精度浮点指令时,另一个调度器不能发出任何指令。 Warp 调度程序只能向一半的 CUDA 内核发出指令。要为 warp 的所有线程执行一条指令,warp 调度程序因此必须在两个时钟周期内为整数或浮点算术指令发出指令。

【讨论】:

感谢您的回答。不过,我的问题是关于算术管道的确切延迟和 warp 调度程序的延迟。我已经更新了问题以使上述内容更加清晰 每个 warp 调度器可以在每个 GPU 时钟周期(不是 Fermi 上的热时钟)发出指令。指令延迟没有记录。您可以通过编写简单的微基准来调查寄存器 RAW 和 WAR 延迟来确定几乎所有指令的延迟。 CUDA 编程指南中记录了许多操作的吞吐量数字。

以上是关于CUDA 中 warp 调度程序的指令发布时间延迟是多少?的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 中每个 Warp 关系的数据大小到指令

CUDA 的 resident warp 问题

cuda为啥要开启32倍数的线程

如果知道warp中所有线程的条件相同,如何避免在CUDA程序中执行条件的两个分支?

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

CUDA:不同经线之间的银行冲突?