Я пытаюсь рассчитать время с помощью RDTSC (никакое другое программное обеспечение для профилирования, которое я пробовал, не может рассчитать необходимое разрешение) в Ubuntu 8.10. Однако я продолжаю получать выбросы от переключателей задач и прерываний, которые приводят к тому, что моя статистика становится недействительной.
Учитывая, что моя программа выполняется за считанные миллисекунды, возможно ли отключить все прерывания (которые по своей сути отключают переключатели задач) в моей среде? Или мне нужно перейти на ОС, которая позволяет мне больше мощности? Буду ли я лучше использовать свое собственное ядро ОС для выполнения этого временного кода? Я пытаюсь доказать наилучшую / наихудшую производительность алгоритма, поэтому он должен быть абсолютно точным по времени.
Соответствующий код, который я сейчас использую:
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.
Итак, напомню, могу ли я запустить этот код без перерыва в ОС? Или мне нужно запустить его на голом оборудовании в ring0, чтобы я мог отключить IRQ и планирование? Заранее спасибо!