You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在RISC-V测试中编译含exp函数的基准测试程序

在RISC-V基准测试中正确使用exp函数的解决方案

先给你梳理下两个核心问题:代码本身的语法/逻辑错误,以及RISC-V编译环境下链接数学库的配置方法。

一、先修正你的代码错误

你的代码里有几个明显的问题,先改了才能正常编译:

  • 变量resultUser_TimeEnd_TimeBegin_Time都未声明,得先定义对应类型:
    • resultexp()的返回值,类型为double,需添加double result;
    • 时间变量要匹配util.h里的定义,一般是unsigned long类型,需添加unsigned long Begin_Time, End_Time, User_Time;
  • printf格式符与变量类型不匹配:
    • valueresult都是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参数(链接数学库),具体步骤如下:

  1. 打开riscv-tests/benchmark目录下的Makefile
  2. 找到链接器参数配置,一般是LDFLAGS变量,在后面追加-lm
    • 如果找不到LDFLAGS,就找编译命令行的链接部分,比如类似$(CC) $(CFLAGS) -o $@ $^的行,在末尾加上-lm,改成$(CC) $(CFLAGS) -o $@ $^ -lm
  3. 另外,如果你是用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

火山引擎 最新活动