为何含IMAD.WIDE指令的CUDA代码每调度器发射Warp数偏低?
问题分析与解答
为什么IMAD.WIDE.U32无法达到0.5的issued warp per scheduler数值?
核心原因在于Turing架构(sm_75)对IMAD.WIDE.U32和普通IMAD指令的硬件执行资源与吞吐量约束不同:
- 普通
IMAD(32位输入、32位输出的乘加指令):每个SM的INT32核心可每周期执行一条,单SM吞吐量为每周期32条(对应1个warp的指令),调度器可每两个周期发射一次,对应0.5的issued warp per scheduler数值。 IMAD.WIDE.U32(32位输入、64位输出的宽乘加指令):它需要占用SM中的整数乘法单元,且硬件吞吐量仅为普通IMAD的一半——单SM每周期最多处理16条指令(对应0.5个warp的指令)。分摊到4个调度器后,每个调度器每周期最多发射0.25个warp的指令,这直接导致观测到的数值低于0.5。
此外,-O0编译模式下编译器不会做指令调度优化,可能进一步加剧调度器发射效率的下降,让数值更低。
是否有可能让IMAD.WIDE.U32的数值接近0.5?
从硬件特性来讲,无法达到普通IMAD的0.5数值上限,因为IMAD.WIDE.U32的硬件吞吐量天生是普通IMAD的一半。但可以通过优化手段让数值尽可能接近硬件上限(0.25左右):
- 改用
-O3编译:让编译器做指令调度与寄存器分配优化,减少不必要的调度间隙。 - 避免同类型指令竞争资源:如果代码中存在其他整数乘法类指令(如MUL.WIDE),会抢占
IMAD.WIDE.U32的执行单元,需尽量减少这类指令的并行数量。 - 确保无隐性依赖:确认代码中无内存访问、分支等可能干扰指令发射的因素,保证调度器能持续发射
IMAD.WIDE.U32指令。
内容的提问来源于stack exchange,提问作者sorfkc
相关产品推荐
相关产品推荐

