其他分享
首页 > 其他分享> > lmbench中的乘法测试用例

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。

 

 

标签:pState,lmbench,struct,TEN,int,register,测试用例,iterations,乘法
来源: https://blog.csdn.net/choumin/article/details/115298806