如何在Linux内核中计算BogoMips?

在linux内核中如何计算bogomips? 为了得到这个值,究竟做了什么?

/* * Standalone BogoMips program * * Based on code Linux kernel code in init/main.c and * include/linux/delay.h * * For more information on interpreting the results, see the BogoMIPS * Mini-HOWTO document. * * version: 1.3 * author: Jeff Tranter (Jeff_Tranter@Mitel.COM) */ #include <stdio.h> #include <time.h> #ifdef CLASSIC_BOGOMIPS /* the original code from the Linux kernel */ static __inline__ void delay(int loops) { __asm__(".align 2,0x90\n1:\tdecl %0\n\tjns 1b": :"a" (loops):"ax"); } #endif #ifdef QNX_BOGOMIPS /* version for QNX C compiler */ void delay(int loops); #pragma aux delay = \ "l1:" \ "dec eax" \ "jns l1" \ parm nomemory [eax] modify exact nomemory [eax]; #endif #ifdef PORTABLE_BOGOMIPS /* portable version */ static void delay(int loops) { long i; for (i = loops; i >= 0 ; i--) ; } #endif int main(void) { unsigned long loops_per_sec = 1; unsigned long ticks; printf("Calibrating delay loop.. "); fflush(stdout); while ((loops_per_sec <<= 1)) { ticks = clock(); delay(loops_per_sec); ticks = clock() - ticks; if (ticks >= CLOCKS_PER_SEC) { loops_per_sec = (loops_per_sec / ticks) * CLOCKS_PER_SEC; printf("ok - %lu.%02lu BogoMips\n", loops_per_sec/500000, (loops_per_sec/5000) % 100 ); return 0; } } printf("failed\n"); return -1; } 

太糟糕了,给出这些

CFLAGS =“ – Wall -O2 -fomit-frame-pointer -finline-functions -s -std = gnu99”

独立的bogomips程序总是失败。 虽然报告的值比/ proc / cpuinfo报告的要低得多,但是从-O2到-O0的变化实际上是可行的。 有趣的是,我已经尝试了所有在gcc(4.4.6)手册页(-O1,-O2甚至-O3)中列出的-f优化器标志,但结果不会改变。 加入-O1后失败。 我想知道什么是严格的优化器标志集应该被启用/禁用的延迟循环不变成一个单一的标量表达式(导致经过的滴答总是保持0)。 为什么-O1使它失败?