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