Dhrystone基准测试在GD32上的移植:代码执行效率与编译器优化等级评估
当你手握一块主频108MHz的GD32F103,满心期待它能跑出漂亮的运算成绩,却发现无优化编译下的Dhrystone跑分竟与隔壁同样主频的ARM Cortex-M3相差近三倍——这不是芯片的问题,是你的编译器在"偷工减料"。Dhrystone,这个诞生于1984年、由计算机科学家Reinhold P. Weicker设计的经典C语言整数运算基准测试程序,至今仍是衡量嵌入式MCU运算效率最直观的标尺。而将它移植到兆易创新GD32平台上,恰恰是一场代码与编译器之间的博弈。
一、Dhrystone为何是MCU性能的"照妖镜"
Dhrystone测试的核心逻辑极其朴素:在单位时间内跑完多少次Dhrystone程序循环,再除以主频(MHz)得到DMIPS/MHz——即每兆赫兹每秒能执行多少百万条指令。1 DMIPS对应VAX-11/780小型机的1757次测试结果,是跨平台横向比较的通用货币。
这套程序只有三个核心文件:dhry_1.c(主程序入口)、dhry_2.c(算法子程序)、dhry.h(原型定义),代码量极小,却涵盖了整型运算、字符操作、数组处理、条件判断、循环、过程调用、字符串处理与指针操作——几乎复刻了嵌入式日常任务的全部编程模式。正因如此,它对编译器优化的敏感度高得惊人:实测中-O3优化比无优化性能提升可达3倍以上,不同编译选项下性能差异甚至高达26.8%。
二、GD32上的移植框架:三步搭建测试骨架
移植Dhrystone到GD32,本质是一次"最小化嵌入式适配"。根据兆易创新官方应用笔记AN164的指引,整个框架可拆解为三层:
第一层:时钟与计时基准。 GD32没有POSIX的clock()调用,必须用硬件定时器替代。典型做法是配置TIMER1为微秒级计数器——预分频器设为(APB1时钟/1MHz)-1,周期设为9999,再级联TIMER2做溢出扩展,实现64位微秒计时。计时精度直接决定DMIPS计算的可信度,±1微秒的误差在10秒测试周期内可以忽略。
第二层:串口输出重定向。 Dhrystone的结果通过printf输出,而GD32的printf默认走半主机模式或需重定向。在工程中实现_write函数,将标准输出映射到USART:
int _write(int fd, char *buf, int size) {
usart_data_transmit(USART0, (uint8_t *)buf, size);
return size;
}
同时需屏蔽主函数中原有的printf调用,仅在Dhrystone的ee_printf中触发,避免启动和停止定时器之间的串口干扰影响计时。
第三层:核心源码整合。 将dhry_1.c、dhry_2.c、dhry.h与GD32对应的cpuidc.o、cpuida.o链接,修改dhry_1.c第31行的编译选项标识为"No Opt"、"Opt 2"或"Opt 3",即可切换不同优化等级。
三、编译器优化等级:从-O0到-O3的性能跃迁
真正的战场在Keil的"Options for Target"里。-O0无优化,代码忠实反映源码逻辑,适合调试但跑分惨不忍睹;-O1基础优化,平衡性能与可读性;-O2较高优化,适合发布;-O3最高优化,启用循环展开、函数内联等激进策略,但代码体积膨胀明显。
以GD32H759I-EVAL的480MHz主频为参照系,GD32F103在108MHz下的典型表现可类比推算:ARM Cortex-M3在72MHz下DMIPS/MHz达1.25,即90 DMIPS;而GD32F103主频高出50%,若启用Thumb-2指令集与硬件除法,DMIPS/MHz可逼近1.25甚至更高。实测中,开启-O2后D1处理器(RISC-V)成绩从112万次/秒飙至300万次/秒,GD32的ARM内核在-O3下同样会出现量级跃升。
更关键的细节是寄存器变量优化(-DREG参数),它强制局部变量驻留寄存器,对GD32这类资源受限的MCU尤为有效——减少内存访问意味着减少总线等待,直接拉升执行效率。
四、结果解读与工程启示
移植完成后,通过串口输出的Dhrystones/Sec除以1757得到DMIPS,再除以主频即为DMIPS/MHz。但必须清醒:直接比较不同架构的DMIPS需谨慎,编译器、缓存命中率、流水线深度都是变量。GD32F103对比STM32F103,主频更高、外设更丰富,但若编译器配置不当,性能优势会被完全抹平。
对于开发者而言,Dhrystone在GD32上的真正价值不在于跑分本身,而在于建立一套可复现的性能基准——用它验证编译选项、评估硬件选型、定位代码瓶颈。当你把-O2设为默认、把Thumb-2指令集打开、把硬件除法启用,GD32才会真正释放它108MHz主频下应有的计算野心。





