gwan getus()getns()结果不正确?

时间:2013-06-05 05:14:21

标签: g-wan high-resolution benchmarking

谁能告诉我,在我的代码之后的块(k - ){},为什么(t1-t0)= 0?
谁可以帮助在其他机器上尝试相同的代码,看看它是否显示相同的问题?
我的机器是HP笔记本电脑 CPU:intel P9300 2.26GHz x 2,
4GB内存,
操作系统:ubuntu 12.04,
Linux内核:3.2.0-45-generic。
这个脚本是gwan的main.c。

typedef struct 
{ 
   u64 a[10000000], b[10000000], c[10000000];

} data_t;

char str[512];
u64 size;



int main(int argc, char *argv[])
{

   data_t **data = (data_t**)get_env(argv, US_SERVER_DATA);
                                        // US_VHOST_DATA);

   if(!*data) // first time: persistent pointer is uninitialized
   {
      *data = (data_t*)calloc(1, sizeof(data_t));
      if(!*data) return 500; // out of memory
      size = sizeof(data_t);
      s_snprintf(str, sizeof(str)-1,   "initialized data: %llu Bytes", size);
      puts(str);
   }


   u64 t0, t1, timea, timeb, timediff, va, vb, vc, wa, wb, wc;
   u64 m, j, n, k;

   for(;;)
   //int i=10; while(i--)
   {
      sleep(1);
      //t1=0;time=0;
      m=10000000; j=m;
      t0 = getms();
      while(j--){
         va = __sync_add_and_fetch(&(*data)->a[1], 1);
         vb = __sync_add_and_fetch(&(*data)->b[2], 2);
         vc = __sync_add_and_fetch(&(*data)->c[3], 3);
      }
      t1 = getms();
      timediff = t1-t0;
      timea = timediff ? (3*m)/(t1-t0) : m;
       // problem code below:
      n=m; k=n;
      t0 = getns();
      while(k--){
         wa++;
         wa--;
         wa++;
         wa--;
      }
      t1 = getns();
      timediff = t1-t0;
      timeb = timediff ? (4*n)/(t1-t0) : n;

      //s_snprintf(str, sizeof(str) - 1, "data[0]->a[1]:%llu, data[0]->b[2]:%llu, data[0]->c[3]:%llu, atomic add:%llu/ms, val++:%llu/ms", 
                                        //data[0]->a[1],      data[0]->b[2],      data[0]->c[3],      timea,   timeb );
                                        //va,      vb,      vc,      timea,   timeb );
      s_snprintf(str, sizeof(str) - 1, "atomic add:%llu/ms, ++val:%llu/ns, end value:%llu", 
                                                   timea,         timeb,         wa );
      puts(str);
   }
   return 0;

日志文件如下:

initialized data: 240000000 Bytes
[Wed Jun 05 04:57:17 2013 GMT] memory footprint: 5.28 MiB.
atomic add:35377/ms, ++val:19531/ns, end value:0
atomic add:30674/ms, ++val:39062/ns, end value:0
atomic add:86206/ms, ++val:10000000/ns, end value:0
atomic add:86455/ms, ++val:10000000/ns, end value:0
atomic add:48309/ms, ++val:10000000/ns, end value:0
atomic add:30706/ms, ++val:10000000/ns, end value:0
atomic add:30674/ms, ++val:10000000/ns, end value:0
atomic add:30674/ms, ++val:10000000/ns, end value:0
atomic add:86705/ms, ++val:10000000/ns, end value:0
atomic add:86455/ms, ++val:10000000/ns, end value:0
atomic add:86455/ms, ++val:10000000/ns, end value:0
atomic add:61099/ms, ++val:10000000/ns, end value:0
atomic add:50167/ms, ++val:10000000/ns, end value:0
...

只有前两个结果以纳秒显示有意义的数据。其余都是++ val:10000000 / ns,即t1-t0 = 0 getus()也有同样的问题 当我使用getms()时,t1-t0总是等于0 注意:第二行是第一行的两倍,即19531 / ns x 2 = 39062 / ns。

2 个答案:

答案 0 :(得分:0)

  

为什么(t1-t0)= 0?

此代码不是特别容易阅读。

为什么不先打印时间值(而不是它们的差异)?然后,我们会看到为什么差异为空。

可能是时间分辨率太低(使连续值相等)或API调用失败(返回0)。

httpdate.c G-WAN示例是否适用于您的计算机?

答案 1 :(得分:0)

[解决]
getns()没有问题 Plz看到链接:https://stackoverflow.com/a/11609063/1796259
我将wa改为volatile,timediff,timea,timeb为float类型。
它给了我正确的结果如下:

atomic add:63829.789062/ms, ++val:0.375601/ns, end value:0
atomic add:63829.789062/ms, ++val:0.376809/ns, end value:0
atomic add:76923.078125/ms, ++val:0.375601/ns, end value:0
atomic add:78947.367188/ms, ++val:0.373209/ns, end value:0
atomic add:78947.367188/ms, ++val:0.375601/ns, end value:0
atomic add:73170.734375/ms, ++val:0.378024/ns, end value:0
atomic add:78947.367188/ms, ++val:0.375601/ns, end value:0
atomic add:78947.367188/ms, ++val:0.375601/ns, end value:0
atomic add:81081.078125/ms, ++val:0.378024/ns, end value:0
atomic add:81081.078125/ms, ++val:0.375601/ns, end value:0

++ val比__syn_add_and_fetch快x5~6。