2009-08-01 4 views
2

나는 RDTSC (필자가 시도한 다른 프로파일 링 소프트웨어는 내가 원하는 해상도로 시간을 낼 수 없음)를 사용하여 타임 코드를 시도하고있다. 우분투 8.10. 그러나 작업 스위치 및 인터럽트 문제로 인해 아웃 라이어가 계속 발생하여 통계가 유효하지 않게되었습니다.중단없이 프로그램을 처음부터 끝까지 실행하려면 어떻게해야합니까?

내 프로그램이 밀리 초 만에 실행되는 것을 고려하면 내 환경에서 모든 인터럽트 (본질적으로 작업 스위치를 끕니다)를 비활성화 할 수 있습니까? 아니면 더 많은 권한을 부여하는 OS로 이동해야합니까? 이 타이밍 코드를 수행하기 위해 자체 OS 커널을 사용하는 것이 나을 것입니까? 나는 알고리즘의 최고/최악의 경우 성능을 증명하려고 시도하고 있으므로 타이밍과 완전히 견고해야합니다.

내가 현재 사용하고 관련 코드입니다 : 내가 제대로이 코드에서 오버 플로우 조건을 취급하고 있지 않다 통지 사람들에게

inline uint64_t rdtsc() 
{ 
    uint64_t ret; 
    asm volatile("rdtsc" : "=A" (ret)); 
    return ret; 
} 

void test(int readable_out, uint32_t start, uint32_t end, uint32_t (*fn)(uint32_t, uint32_t)) 
{ 
    int i; 
    for(i = 0; i <= 100; i++) 
    { 
     uint64_t clock1 = rdtsc(); 
     uint32_t ans = fn(start, end); 
     uint64_t clock2 = rdtsc(); 

     uint64_t diff = clock2 - clock1; 

     if(readable_out) 
      printf("[%3d]\t\t%u [%llu]\n", i, ans, diff); 
     else 
      printf("%llu\n", diff); 
    } 
} 

추가 점. 이 단계에서 나는 프로그램이 타임 슬라이스를 잃어서 갑작스러운 점프없이 일관된 결과물을 얻으 려하고있다.

내 프로그램의 멋진 값은 -20입니다.

다시 요약하면 OS에서 중단없이이 코드를 실행할 수 있습니까? 또는 ring0에있는 베어 하드웨어에서 실행해야하므로 IRQ 및 예약을 비활성화 할 수 있습니까? 미리 감사드립니다!

+0

OProfile을 사용해 보셨습니까? : http://oprofile.sourceforge.net/news/ –

답변

3

, 각 테스트에 대해 "신선한"타임 슬라이스를 얻어야한다. 100HZ 타이머 인터럽트를 사용하여 커널을 컴파일하고 10ms 미만의 시간 초과 기능이 완료되면 타이머 인터럽트가 이러한 방식으로 발생하는 것을 피할 수 있어야합니다.

다른 인터럽트를 최소화하려면 모든 네트워크 장치의 구성을 해제하고 스왑없이 시스템을 구성한 다음 시스템이 정지되어 있는지 확인하십시오.

+0

sched_yield와 비슷한 결과를 얻었습니다. sched_yield는 결과 집합을 개선했습니다. –

2

까다 롭습니다. 나는 당신이 운영체제를 끄고 엄격한 스케줄링을 보장 할 수 있다고 생각하지 않는다.

나는 이것을 거꾸로 돌린다. 너무 빨리 달리고, 여러 번 실행하여 결과 분포를 수집한다. 표준 우분투 리눅스가 좁은 의미에서 실시간 운영체제가 아니라는 것을 감안할 때, 모든 대안 알고리즘은 동일한 설정에서 실행될 것입니다. 그런 다음 (요약 통계에서 qqplots에 이르기까지) 분포를 비교할 수 있습니다. 당신은 파이썬, 또는 R, 또는 옥타브와 비교할 수 있습니다 ... 어느 것이 든 당신에게 가장 어울립니다.

+1

나는 그로 인해 (따라서 for 루프) 작업하고 있습니다. 문제는 평균값과 표준 편차를 벗어나는 데이터의 나머지 부분보다 특이 값이 더 크다는 것입니다. –

+0

하지만 지금 우리는 통계적 토론을하고 있습니다 :-) 평균 및 표준 편차는 정규 분포를 완전하게 설명하지만 데이터가 정상적으로 분배되지 않을 수도 있습니다. 가능한 경우 quantile과 plot으로 꼬리, 특히 '나쁜'것을 기술하십시오. 당신이 대안들과 비교하는 것은 최악의 경우입니다 ... 그것은 더 나쁠 수도 있습니다. [물론 나머지 배포판에는 설명이 필요합니다 ...] –

+0

유효한 지점입니다. 하지만 11,000 ~ 12,000 주위에 90 개가 넘는 값을 갖고 나서 어떤 값이 50,000을 치고 전체를 버리는 것은 실망 스럽습니다. 그것은 내가 생성하려고하는 통계에 크게 간섭하는 * 잘못된 값입니다. –

0

root로 실행하는 경우 sched_setscheduler()를 호출하여 사용자에게 실시간 우선 순위를 부여 할 수 있습니다. 설명서를 확인하십시오.

2

it's a single process OS부터 FreeDOS으로 퇴장 할 수 있습니다.

86 세계에서 DOS 시스템의 드 사실상의 표준 인 마이크로 소프트의 DOS 구현, 단일 사용자가

, 단일 태스킹 운영 :

여기에 두 번째 링크에서 관련 텍스트입니다 체계. 은 하드웨어에 원시 액세스를 제공하고 OS API 용 최소 레이어 만 파일 I/O와 같은 것을 에 제공합니다. 운영체제를 사용하지 않고 무언가를 얻으려면 종종 시스템이 필요하기 때문에 이것은 임베디드 시스템에서 좋은 점입니다.

DOS에는 스레드 개념이없고 다중 처리 개념이 없습니다 ( 진행중인 프로세스가 있음).응용 프로그램 소프트웨어는 다양한 하드웨어가 소프트웨어를 호출 할 경우는 디렉토리를 읽는 파일을 실행처럼 다양한 일을 처리하는 인터럽트 비디오 및 오디오 같은 것들, 그리고 를 처리하는 인터럽트 호출, 인터럽트 인터페이스의 사용을 통해 시스템 호출을하고, 그래서 앞.

물론 에뮬레이터가 아닌 실제 하드웨어로 실제로 FreeDOS를 부팅하는 최상의 성능을 얻을 수 있습니다.

실제로는 이 사용되었습니다. FreeDOS,하지만 프로그램이 표준 C로 보이므로 FreeDOS의 표준 컴파일러가 무엇이든 사용할 수 있습니다.

+0

좋은 링크 - good ol 'DOS는 프로그램을 실행하는 컴퓨터를 포기한다. –

1

chrt -f 99 ./test을 사용하면 최대 실시간 우선 순위로 ./test를 실행할 수 있습니다. 그렇다면 적어도 다른 사용자 공간 프로세스에 의해 중단되지 않습니다.

또한, linux-rt 패키지를 설치하면 실시간 커널이 설치되므로 스레드 인터럽트를 통해 인터럽트 처리기 우선 순위를보다 효과적으로 제어 할 수 있습니다.

+0

또한 Linux RT 패치 (http://rt.wiki.kernel.org/index.php/Main_Page)를 사용하여 인터럽트 지연 시간을 최소화합니다. – bdonlan

2

프로그램이 밀리 초 단위로 실행되고 있고 Linux에서 실행중인 경우 타이머 빈도 (Linux)가 100Hz (1000Hz 아님)로 설정되어 있는지 확인하십시오. (cd/usr/src/linux, menuconfig를 만들고 "프로세서 유형 및 기능"-> "타이머 빈도") 이렇게하면 CPU가 10ms마다 중단됩니다.

또한 Linux의 기본 CPU 시간 슬라이스가 100ms이므로 좋은 수준 -20이면 몇 밀리 초 동안 실행 중이면 취소되지 않습니다.

또한 fn()에서 101 번 반복됩니다. fn()을 시스템을 올바르게 조정할 필요가 없는지 고려하십시오.

인쇄하는 횟수가 너무 많아서 (평상시 + 표준 시간대) 일정 시간이 소요되어 결국 일정이 잡히지 않게됩니다. 당신이 테스트를 반복 할 때마다 전에 그래서 즉시 초를 위해 잠을 nanosleep를()를 호출하면

RDTSC benchmark sample code

+0

팁 주셔서 감사합니다. –

0

아마도 Linux에서 선점 예약을 비활성화하는 방법이 있지만 필요하지 않을 수 있습니다. /proc/<pid>/schedstat 또는 /proc의 다른 객체의 정보를 잠재적으로 사용하여 선매를했을 때를 감지하고 해당 타이밍 샘플을 무시할 수 있습니다.

관련 문제