2012-02-06 4 views
2

여러 프로세서에서 실행되는 병렬 알고리즘을 분석 중입니다.C/C++ - 장기 실행 작업 시뮬레이션

그러나 단순한 것이므로 효과적인 속도 향상을 분석하려면 장기 실행 작업을 시뮬레이트해야합니다.

  1. sleep()/usleep() 옵션이 아닙니다. 다른 슬레이브가 잠자기 상태 일 때 슬레이브 프로그램이 작동하지 않도록 CPU를 계속 사용해야합니다. 여기서 속도 향상이 잘못되었습니다.

  2. for-loop 용으로 긴 비어있는 옵션입니다. 그러나 나는 또한 작업 시간을 명시 적으로 설정하려고합니다.

이러한 두 가지를 결합하거나 다른 방법으로 시간이 오래 걸리는 긴 동작을 얻을 수있는 방법이 있습니까?

답변

4

루프를 입력하기 전에 gettimeofday으로 전화하고 시간을 기억하십시오. 루프 내에서 gettimeofday을 연속 호출하여 현재 시간과 시작 시간의 차이를 계산합니다. 차이가 충분히 클 때 루프에서 벗어납니다. 그런

본질적으로

, 뭔가 :

struct timeval tv_begin, tv_current; 
gettimeofday(&tv_begin, NULL); 

for (;;) { 
    gettimeofday(&tv_current, NULL); 
    unsigned long long diff = 
     (tv_current.tv_sec * 1000000 + tv_current.tv_usec) - 
     (tv_begin.tv_sec * 1000000 + tv_begin.tv_usec); 

    if (diff > TIMEOUT) 
     break; 
} 
+0

감사합니다. 나는 그것을 시도 할 것이다. – BinarySnow

+0

하지만 (tv_begin.tv_sec * 1000000 + tv_begin.tv_usec) 계산을 한 번 해보고 잠깐 for-loop를 사용하여 gettimeofday를 좀처럼 호출하지 않는 것이 좋습니다. 내 프로그램은 실제로 CPU가 아닌 여러 코어에서 내 PC에서 실행됩니다. 그래서 나는 많은 노예들로부터 gettimeofday를 그렇게 자주 너무 열심히 부를 것이라고 생각합니다. – BinarySnow

+0

실시간 클럭 레지스터 (CPU에 하나가있는 경우)를 사용하면 시스템을 너무 심하게로드하지 않을 수 있습니다. –

2

getitimer()/setitimer(). 타이머를 설정하고, SIGALRM을위한 시그널 핸들러로 하여금 당신을 루프에서 빠져 나올 스위치를 설정하게하십시오. 루프는 타이머가 꺼질 때까지 타이머가 수행 할 작업을 수행합니다.

+0

감사합니다. 나는 그것을 옵션으로 시도 할 수 있습니다. – BinarySnow

+0

+1, 각 반복마다 시스템 호출을 발생시키지 않으므로 컨텍스트 전환이 적기 때문에 더 나은 옵션 일 수 있습니다. –