RISC-V 64位平台中mulw是否比mul更快?矩阵乘法实测疑问
RISC-V中mul替换为mulw后速度更快的原因分析
硬件实现差异是核心原因
RISC-V指令集仅定义指令的功能行为,不约束硬件实现细节。不同厂商的CPU核对mul(64位乘法)和mulw(32位乘法并截断)的硬件支持差异极大:- 部分低端嵌入式RISC-V核没有专门的64位乘法单元,执行
mul时需要拆分多次32位乘法运算,延迟远高于mulw; - 即使配备64位乘法单元,
mulw对应的硬件电路通常更小、延迟更短,或能与其他指令更好地流水线并行,吞吐量更高。
- 部分低端嵌入式RISC-V核没有专门的64位乘法单元,执行
编译器优化的关联
你使用的是未优化的C代码,Clang未做变量范围分析,无法确定矩阵乘法的结果仅需低32位,因此生成了通用的mul指令。手动替换为mulw相当于明确告知硬件:只需32位乘法结果,这会触发更高效的硬件执行路径。若开启编译器优化(如-O2),Clang会自动根据变量类型(比如int型矩阵元素)生成mulw,无需手动修改汇编。指令行为一致,但性能表现不一定
从RISC-V规范来看,mulw的功能行为是完全统一的:将两个操作数的低32位相乘,结果截断为32位(RV64架构下会符号扩展为64位)。所有符合规范的RISC-V芯片,mulw的计算结果都一致,但性能(延迟、吞吐量)会因硬件设计不同而差异明显——在部分高性能RISC-V核上,mul和mulw的执行速度可能几乎无区别。验证建议
- 在不同RISC-V硬件/模拟核上测试(如QEMU模拟的rv64gc核、VisionFive 2开发板、SiFive Unleashed开发板),对比两者的性能差异;
- 检查C代码的变量类型:若矩阵元素是32位整数(
int),开启优化后编译器会自动生成mulw,此时手动修改汇编的收益会消失。
内容的提问来源于stack exchange,提问作者yinghao
相关产品推荐
相关产品推荐

