不同架构C函数编译产生的代码指令数

使用相同的编译选项,一个是RV32GC扩展,一个是RV64GC扩展,使用ZCC4.1.6版本,通过编译产生的dump文件查看,同一个函数为什么RV64GC扩展的指令数远大于RV32GC扩展的指令数.以core_bench_matrix函数为例,RV32GC扩展的指令数1700左右,RV64GC扩展的指令数2400左右

rv32和rv64的abi不一样,同时指令能处理的数据宽度也不一样,这些差异对优化会产生一些影响,因此产生的汇编指令数量会出现差异

这abi的差异有这么大吗?这样的结果会导致跑benchmark的性能更差呀,64bit的处理器会执行更多的指令。

你说的是从汇编文件看到的静态指令数的数量还是程序执行时的动态指令数的数量。动态指令数应该不会有太大差别。

实际执行的时候,32系统执行了20万条指令,64执行了25万条指令

是否可以提供一下rv32gc和rv64gc生成的elf程序,我们测试coremark在rv32gc和rv64gc下的动态指令数没有太大区别。

可以,论坛上好像不可以发送文件,邮箱已经发送

我好像没有收到邮件, 是发到哪个邮箱了。

你可以发到这个邮箱zhengpeng.zhao@terapines.com

主要原因有两个:

  1. 32位时开启了b扩展,64位时没有开启b扩展。32位时能产生sh1add/sh2add/sh3add指令(来自zba扩展),减少了指令数。
  2. 64位平台的指令进行的是64位操作,但是int类型在64位平台仍然是32位。在进行移位、加法等操作时需要更多的指令,比如左移不再是一条指令,而是两条指令,因为移位后需要做符号位扩展;加法之后需要进行截断处理等等。

b扩展的影响会更大一点,因为b扩展的指令较多地出现在循环里。可以先给64位也加上b扩展再对比一次,看看是否仍然有较大差距。