Я пытаюсь использовать код времени, используя 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 и планирование? Заранее спасибо!
Вы пробовали OProfile: http://oprofile.sourceforge.net/news/ –