我正在使用 rdtsc 和 cpuid 指令(使用易失性内联汇编指令)来测量程序的 CPU 周期。rdtsc 指令为我在 Linux(使用速度优化 -o2 -fomit-frame-pointer)和 Windows(使用 MS Visual Studio 2008 的速度优化选项 C 编译器(我认为它的 VC 9.0))上的程序提供了真实的结果。
最近,我实现了一个新程序,它使用了大量的表格查找和类似的东西。然而,这个程序在 Linux 上使用 gcc 优化的 rdtsc 测量结果总是比我预期的错误测量结果(非常少的 CPU 周期数)。同一程序在 Windows 上运行时的 rdtsc 测量结果(使用我上面提到的优化和编译器编译)是现实的,并且符合预期。
我的问题是 gcc 优化有什么方法可以将易失性汇编指令移动到产生上述行为的地方?
我的计时器代码如下:
#define TIMER_VARS \
uint32 start_lo, start_hi; \
uint32 ticks_lo, ticks_hi
#define TIMER_START() \
__asm__ __volatile__ \
("rdtsc" \
: "=a" (start_lo), "=d" (start_hi) /* a = eax, d = edx*/ \
: /* no input parameters*/ \
: "%ebx", "%ecx", "memory")
#define TIMER_STOP() \
__asm__ __volatile__ \
("rdtsc" \
"\n subl %2, %%eax" \
"\n sbbl %3, %%edx" \
: "=&a" (ticks_lo), "=&d" (ticks_hi) \
: "g" (start_lo), "g" (start_hi) \
: "%ebx", "%ecx", "memory")
如果有人能就此提出一些想法,我将不胜感激。
谢谢,