私は古いPCを持っています。
プロセッサのMIPS(Million Instruction Per Second)とDMIPSを正確に計算したい。
これに対して何ができますか?
4 に答える
あなたが望んでいたことに沿って、MIPSをある方法で測定するためにおそらく使用できる一種のベンチマークを実行するいくつかのブートローダーコードがあります。ここでの主な目的は低レベルであり、BIOSなどを交換する意思がない限り、これは実際にPCでプログラムできる最低レベルであると思います。
とにかく、これはフロッピーイメージのコードであり、起動時に4つadd
の命令(2つ、1つsub
、および1つの条件付きジャンプ)を100万回実行しようとします。命令が実行される回数は、ITERS
マクロによって制御されます。それを上げたり下げたりすることで、何回の反復が行われるかを指定できます。
時間は、電源投入以降に行われたプロセッサティックの数をレジスタとrdtsc
の64ビット数として返す命令を使用して測定されます。ループを実行する前と実行する前のこの値の差を計算することにより、プロセッサがループの実行に費やしたティック数を取得します。次に、BIOS 10h呼び出しを16進値として使用して、その値が画面に出力されます。それに費やされる実際の時間は、明らかに、プロセッサクロックの周波数に依存します。edx
eax
これがソースです。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に相当します。
非常に大雑把な方法は次のとおりです。
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)
Dhrystone mipの場合、スコアを取得するにはDhrystoneスイートを実行し、スコアを1757で割る必要があります。
特定のGHZでのプロセッサタイプごとのMIPSのリストがあります。
http://en.wikipedia.org/wiki/Instructions_per_second
それ以外の場合は、ベンチマークをプログラムして(あまり実行せずにコンソールで)実行するか、どこかからベンチマークをダウンロードして実行することができます。
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です。