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