lmbench中的乘法测试用例

lmbench 是开源的性能测试工具,在 src/lat_ops.c 中有很多基本运算的测试用例,比如 int add、int mul、int64 div、double div 等等。
其中,int mul 测试用例的实现函数是:

void do_integer_mul(iter_t iterations, void* cookie)
{
    struct _state *pState = (struct _state*)cookie;
    register int r = pState->N + 37431;
    register int s = pState->N + 4;
    register int t = r * s * s * s * s * s * s * s * s * s * s - r;

    while (iterations-- > 0) {
        TEN(r *= s;); r -= t;
        TEN(r *= s;); r -= t;
    }
    use_int(r);
}

其中,TEN() 宏的定义是:

#define TEN(a) a a a a a a a a a a

下面是预处理后的结果,可以看到:在循环开始前,t = r * s ^ 10 - r,在循环里,TEN(r *= s) 的结果是:r = r * s ^ 10,紧接着又执行了 r -= t,使得 r 的值恢复为循环开始前的: pState->N + 37431。

void do_integer_mul(iter_t iterations, void* cookie)
{
 struct _state *pState = (struct _state*)cookie;
 register int r = pState->N + 37431;
 register int s = pState->N + 4;
 register int t = r * s * s * s * s * s * s * s * s * s * s - r;

 while (iterations-- > 0) {
  r *= s; r *= s; r *= s; r *= s; r *= s; r *= s; r *= s; r *= s; r *= s; r *= s;; r -= t;
  r *= s; r *= s; r *= s; r *= s; r *= s; r *= s; r *= s; r *= s; r *= s; r *= s;; r -= t;
 }
 use_int(r);
}

在这种情况下,对于高版本的编译器(比如:gcc 8.3.0),会直接将乘法运算优化掉,从而无法真实测的乘法运算的性能数据。可以使用低版本的编译器(比如:gcc 4.8.5),或者修改变量的 t 的取值,例如,修改为 t = r * s ^ 9 - r。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值