2013-06-05 8 views
0

(k -) {} 동안 블록 뒤에 내 코드에서 누가 (t1-t0) = 0인지를 알 수있는 사람은 누구입니까?
다른 컴퓨터에서 같은 코드를 사용해도 동일한 문제가 있는지 누가 알 수 있습니까? 인텔 P9300의과 2.26GHz × 2,
4GB의 메모리,
OS : 12.04 우분투,
리눅스 커널 : 3.2.0-45 제네릭
내 기계는
CPU와 HP 노트북입니다.
이 스크립트는 gwan의 main.c입니다. 나노초gwan getus() getns() 부적절한 결과?

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 
... 

첫 번째 두 결과 상영 의미있는 데이터 :

 // 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; 

아래 로그 파일

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; 

. 나머지는 모두 ++ val : 10000000/ns, 즉 t1-t0 = 0입니다.
getus()와 동일한 문제가 발생합니다.
getms()를 사용할 때 t1-t0은 항상 0입니다.
참고 : 두 번째 줄은 첫 번째 줄의 두 번째 줄, 즉 19531/ns x 2 = 39062/ns입니다.

답변

0

왜 (t1-t0) = 0입니까?

이 코드는 특히 읽기 쉽지 않습니다.

왜 시간 값을 인쇄하지 않아도됩니까 (차이가 아닌)? 그런 다음 왜 차이가 null인지 알 수 있습니다.

시간 해상도가 너무 낮거나 (연속 값이 같음) API 호출이 실패 (0을 반환)하는 것일 수 있습니다.

기계에서 httpdate.c G-WAN 예제가 작동합니까?

0

[SOLVED]
getns()에는 문제가 없습니다.
Plz 링크를 참조하십시오 : https://stackoverflow.com/a/11609063/1796259
나는 WA를 휘발성으로 변경하고 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 

++ 발은 __syn_add_and_fetch보다 빠른 X5 ~ 6 인 :
그것은 나에게 다음과 같이 적절한 결과를 주었다.

+0

답을 게시 해 주셔서 감사합니다. 그들의 이익을 감안할 때, 원자 작업 타이밍은 나쁘지 않습니다. 항상 모든 경우에 안전 할 수있는 메모리 장벽을 사용하기 때문에 GCC 기본 내장 함수보다 더 빠르게 수행하는 것이 가능합니다. 자신 만의 원자 연산을 asm으로 제작하면 보안이 덜 필요한 경우에 대비하여 수분을 만들 수 있습니다. – Gil