ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

lmbench中的乘法测试用例

2021-03-29 13:32:44  阅读:295  来源: 互联网

标签:pState lmbench struct TEN int register 测试用例 iterations 乘法


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有