나는 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 및 예약을 비활성화 할 수 있습니까? 미리 감사드립니다!
OProfile을 사용해 보셨습니까? : http://oprofile.sourceforge.net/news/ –