如何在RISC-V测试中编译含exp函数的基准测试程序
在RISC-V基准测试中正确使用exp函数的解决方案
先给你梳理下两个核心问题:代码本身的语法/逻辑错误,以及RISC-V编译环境下链接数学库的配置方法。
一、先修正你的代码错误
你的代码里有几个明显的问题,先改了才能正常编译:
- 变量
result、User_Time、End_Time、Begin_Time都未声明,得先定义对应类型:result是exp()的返回值,类型为double,需添加double result;- 时间变量要匹配
util.h里的定义,一般是unsigned long类型,需添加unsigned long Begin_Time, End_Time, User_Time;
printf格式符与变量类型不匹配:value和result都是double类型,不能用%ld(长整型格式符),要改成%lf或%f- 循环结束后
value的值是-150 + 500 = 350,你打印的是最终的value,这点要注意
修正后的代码如下:
#include <stdint.h> #include "util.h" #include <math.h> #include <stdio.h> int main() { double value = -150; double result; // 声明result变量 unsigned long Begin_Time, End_Time, User_Time; // 声明时间变量 Start_Timer(); for(int i=0; i<500 ;i++){ result = exp(value); value++; } Stop_Timer(); User_Time = End_Time - Begin_Time; printf("User_Time: %ld - %ld = %ld\n", End_Time, Begin_Time, User_Time); printf("The Exponential of %lf is %lf\n", value, result); return 0; }
二、配置RISC-V基准测试的Makefile
你提到修改riscv-test/benchmark下的Makefile有难度,其实核心就是给编译链接过程加上-lm参数(链接数学库),具体步骤如下:
- 打开
riscv-tests/benchmark目录下的Makefile - 找到链接器参数配置,一般是
LDFLAGS变量,在后面追加-lm- 如果找不到
LDFLAGS,就找编译命令行的链接部分,比如类似$(CC) $(CFLAGS) -o $@ $^的行,在末尾加上-lm,改成$(CC) $(CFLAGS) -o $@ $^ -lm
- 如果找不到
- 另外,如果你是用C代码编译,
-x c参数一般不需要(默认.c文件会按C语言编译),除非你的文件后缀不是.c,才需要加-x c指定编译语言
举个修改示例,假设Makefile里有这段规则:
%.riscv: %.c $(CC) $(CFLAGS) $(INCLUDE) -o $@ $^
修改后变成:
%.riscv: %.c $(CC) $(CFLAGS) $(INCLUDE) -o $@ $^ -lm
这样编译时就会自动链接数学库,解决exp函数未定义的错误。
三、验证编译运行
修改完代码和Makefile后,直接在benchmark目录下执行make命令,就能正常编译你的基准测试程序了。运行时用RISC-V模拟器(比如qemu-riscv64)或者真实硬件执行即可。
内容的提问来源于stack exchange,提问作者ARK91




