我正在尝试在 Ubuntu 8.10 上使用 RDTSC(我尝试过的其他分析软件无法达到我需要的分辨率)来计时代码。但是,我不断收到来自任务切换和中断触发的异常值,这导致我的统计数据无效。
考虑到我的程序在几毫秒内运行,是否可以在我的环境中禁用所有中断(这会固有地关闭任务开关)?还是我需要去一个可以让我拥有更多权力的操作系统?使用我自己的操作系统内核来执行这个计时代码会更好吗?我试图证明算法的最佳/最差情况性能,因此它必须完全符合时间要求。
我目前使用的相关代码是:
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 和调度?提前致谢!