ブロック while(k--){} の後の私のコードで、 (t1-t0)=0 の理由を誰が知ることができますか?
他のマシンで同じコードを試して、同じ問題が発生するかどうかを確認できるのは誰ですか?
私のマシンは、
CPU を搭載した HP ノートブックです: intel P9300 2.26GHz x 2、4GB
メモリ、
OS: 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
...
最初の 2 つの結果だけが、ナノ秒単位で意味のあるデータを示しています。残りはすべて ++val:10000000/ns、つまり t1-t0 = 0
です。getus() と同じ問題です。
getms() を使用すると、t1-t0 は常に 0 になり
ます。注: 2 行目は最初の行の 2 倍です。つまり、19531/ns x 2 = 39062/ns です。