Tag: benchmarking

英特尔的时间戳读取asm代码示例是否使用了两个以上的寄存器?

我正在研究使用x86 CPU中的时间戳寄存器(TSR)来测量基准性能。 它是一个有用的寄存器,因为它以单调时间单位测量,不受时钟速度变化的影响。 很酷。 这是一份英特尔文档,显示了使用TSR进行可靠基准测试的asm片段,包括使用cpuid进行管道同步。 见第16页: http://www.intel.com/content/www/us/en/embedded/training/ia-32-ia-64-benchmark-code-execution-paper.html 要读取开始时间,它说(我注释了一下): __asm volatile ( “cpuid\n\t” // writes e[abcd]x “rdtsc\n\t” // writes edx, eax “mov %%edx, %0\n\t” “mov %%eax, %1\n\t” // :”=r” (cycles_high), “=r” (cycles_low) // outputs : // inputs :”%rax”, “%rbx”, “%rcx”, “%rdx”); // clobber 我想知道为什么使用临时寄存器来获取edx和eax的值。 为什么不删除mov并从edx和eax读取TSR值? 像这样: __asm volatile( “cpuid\n\t” “rdtsc\n\t” // : “=d” (cycles_high), “=a” (cycles_low) […]