0

谁能告诉我,在我的代码块 while(k--){} 之后,为什么 (t1-t0)=0 ?
谁能帮忙在别的机器上试试同样的代码,看看是不是同样的问题?
我的机器是惠普笔记本,
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。

4

2 回答 2

0

[已解决]
getns() 没有问题。
请查看链接: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。

于 2013-06-05T14:04:30.810 回答
0

为什么 (t1-t0)=0 ?

这段代码不是特别容易阅读。

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

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

httpdate.c G-WAN 示例是否在您的机器上运行?

于 2013-06-05T10:16:33.823 回答