7

私は古いPCを持っています。
プロセッサのMIPS(Million Instruction Per Second)とDMIPSを正確に計算したい。
これに対して何ができますか?

4

4 に答える 4

4

あなたが望んでいたことに沿って、MIPSをある方法で測定するためにおそらく使用できる一種のベンチマークを実行するいくつかのブートローダーコードがあります。ここでの主な目的は低レベルであり、BIOSなどを交換する意思がない限り、これは実際にPCでプログラムできる最低レベルであると思います。

とにかく、これはフロッピーイメージのコードであり、起動時に4つaddの命令(2つ、1つsub、および1つの条件付きジャンプ)を100万回実行しようとします。命令が実行される回数は、ITERSマクロによって制御されます。それを上げたり下げたりすることで、何回の反復が行われるかを指定できます。

時間は、電源投入以降に行われたプロセッサティックの数をレジスタとrdtscの64ビット数として返す命令を使用して測定されます。ループを実行する前と実行する前のこの値の差を計算することにより、プロセッサがループの実行に費やしたティック数を取得します。次に、BIOS 10h呼び出しを16進値として使用して、その値が画面に出力されます。それに費やされる実際の時間は、明らかに、プロセッサクロックの周波数に依存します。edxeax

これがソースです。NASMを使用してコンパイルすると-f bin、フロッピーイメージが取得されます。このイメージは、たとえば、生のブロック書き込みプログラムを使用してフロッピーに書き込む必要があります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

私のかなり古いAMDAthlonXP 1700+では、0x1e8596このコードを実行した結果、2000278CPUティックに相当します。CPUは1466MHzで動作するため、これはほぼ1,36msに相当します。

于 2012-07-09T18:16:07.263 に答える
3

非常に大雑把な方法は次のとおりです。

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 + float)

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

Dhrystone mipの場合、スコアを取得するにはDhrystoneスイートを実行し、スコアを1757で割る必要があります。

于 2012-07-09T10:33:52.397 に答える
2

特定のGHZでのプロセッサタイプごとのMIPSのリストがあります。

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

それ以外の場合は、ベンチマークをプログラムして(あまり実行せずにコンソールで)実行するか、どこかからベンチマークをダウンロードして実行することができます。

于 2012-07-09T11:16:53.713 に答える
1

MIPSの計算は、プロセッサが1サイクルで実行する命令の数とクロック速度を知ることで実行できます。

MIPS =(プロセッサクロック速度*サイクルごとに実行される命令の数)/(10 ^ 6)。

たとえば、TI 6487は1サイクルあたり8つの32ビット命令を実行でき、クロック速度はコアあたり1.2GHzです。

したがって、MIPS =((1.2 * 10 ^ 9)* 8)/(10 ^ 6)=コアあたり9600 MIPSであり、このDSPには3つのコアがあるため、DSPの合計MIPSは28800です。

于 2013-09-15T12:48:29.897 に答える