【问题标题】:How to calculate MIPS of my processor?如何计算我的处理器的 MIPS?
【发布时间】:2012-07-08 17:54:45
【问题描述】:

我有一台旧电脑。
我想准确计算其处理器的 MIPS(每秒百万指令)和 DMIPS。
我可以为此做些什么?

【问题讨论】:

    标签: performance architecture x86 preprocessor performance-testing


    【解决方案1】:

    根据您的需要,这里有一些引导加载程序代码,它执行一种基准测试,可能用于以某种方式测量 MIPS。这里的主要目标是低级,我相信这是您可以实际使用 PC 进行编程的最低级别,除非您愿意更换 BIOS 或其他东西。

    无论如何,这是软盘映像的代码,当它启动时,将尝试执行四条指令(两条adds,一条sub,和一条条件跳转)一百万次。指令执行的次数由ITERS 宏控制。通过提高或降低它,您可以指定应该进行多少次迭代。

    时间是通过使用rdtsc 指令来测量的,该指令在寄存器edxeax 中以64 位数字的形式返回自上电以来的处理器节拍数。通过在执行循环之前和之前计算这个值的差异,我们得到处理器执行它所花费的滴答数。然后使用 BIOS 10h 调用将该值作为十六进制值输出到屏幕。显然,实际花费的时间取决于处理器时钟的频率。

    这里是来源。如果您使用带有-f bin 的NASM 编译它,您将获得软盘映像,然后应该使用一些原始块写入程序将其写入软盘,例如dd。然后,在引导时,选择软盘作为引导介质。所有这些也可以使用 USB 驱动器,但这更多地依赖于 BIOS。与所有低级的东西一样,我对在您的计算机上实际执行此软件的结果不承担任何责任。

    bits 16
    org 0x7c00
    
    ITERS equ 1000000
    
    jmp 0x0000:start
    
    start:
        cli
        xor ax, ax
        mov ds, ax
        mov ss, ax
        mov sp, stack_end
    
        rdtsc
        mov [old_rdtsc], eax
        mov [old_rdtsc+4], edx
        mov eax, ITERS
    
    .loop:
        add ebx, ecx
        add ecx, edx
    
        sub eax, 1
        jnz .loop
    
        rdtsc
    
        sub eax, [old_rdtsc]
        sbb edx, [old_rdtsc+4]
    
        mov si, 15
    
    .fillbuf_eax:
        mov edi, eax
        shr eax, 4
        and di, 0xf
        mov bl, [hex_chars+di]
        mov [str_buf+si], bl
        sub si, 1
        cmp si, 7
        ja .fillbuf_eax
    
    .fillbuf_edx:
        mov edi, edx
        shr edx, 4
        and di, 0xf
        mov bl, [hex_chars+di]
        mov [str_buf+si], bl
        sub si, 1
        jns .fillbuf_edx
    
        mov ah, 0xe
        xor bx, bx
    .bios_write:
        pusha
        mov al, [str_buf+bx]
        int 10h
        popa
        add bx, 1
        cmp bx, 16
        jb .bios_write
    
        sti
    
    .halt:
        hlt
        jmp .halt
    
    hex_chars db "0123456789ABCDEF"
    old_rdtsc resq 1
    str_buf resb 16
    
    STACK_SIZE equ 200
    stack resb STACK_SIZE
    stack_end equ $
    
    times 510-($-$$) db 0x90
    db 0x55, 0xaa
    

    在我相当旧的 AMD Athlon XP 1700+ 上,我得到 0x1e8596 作为执行此代码的结果,这等于 2000278 个 CPU 滴答声。由于 CPU 以 1466MHz 运行,这或多或少等于大约 1.36 毫秒。

    【讨论】:

      【解决方案2】:

      这是一种非常粗暴的做法:

      get start time.
      add two numbers million times <- repeat this N times, N >= 1
      get end time.
      
      MIPS = (end time - start time) in seconds / N. 
      

      在这里找到套件(在 C 中,int+floating)

      https://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/Dhrystone/?diff_format=h&sortby=date

      对于 Dhrystone mips,您需要运行 Dhrystone 套件来获取分数,然后将分数除以 1757。

      【讨论】:

      • 通过执行此其他进程(如操作系统指令,...)将增加运行时间。当处理器仅执行我的指令而不执行其他指令时,此公式有效。我希望我的 MIPS 非常紧凑。跨度>
      • 那么您将不得不在没有操作系统的情况下运行您的代码。有什么问题?
      • 以下是在没有操作系统的情况下运行的几个快速步骤: 1. 生成一个 ELF 二进制文件,从偏移 1mb 开始(保护模式)。使用相同的链接描述文件。 2. 向其添加多重引导可执行标头。 3. 确保您有基准使用的基本功能的简单实现 - 例如 printf,以打印结果(如果有)。编译并将这些静态链接到您的可执行文件中。
      【解决方案3】:

      在特定 GHZ 上按处理器类型列出了 MIPS 列表

      http://en.wikipedia.org/wiki/Instructions_per_second

      否则,您可以对基准进行编程并运行它(在控制台中运行不多)或从某个地方下载基准并运行它.....

      【讨论】:

        【解决方案4】:

        知道您的处理器将在一个周期内执行多少条指令以及您的时钟速度,就可以计算出 MIPS。

        MIPS = (处理器时钟速度 * 每个周期执行的指令数)/(10^6)。

        例如 TI 6487 每个周期可以执行 8 条 32 位指令,时钟速度为每个内核 1.2 GHz。

        所以 MIPS = ((1.2 * 10^9) * 8)/(10^6) = 9600 MIPS 每个内核,这个 DSP 有 3 个内核,所以 DSP 的总 MIPS 是 28800。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-23
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          相关资源
          最近更新 更多