Senin, 24 Desember 2007

Mengetahui Kecepatan Prosesor dengan Instruksi RDTSC

(Sumber www.sony-ak.com)
RDTSC (read time-stamp counter) merupakan suatu instruksi yang digunakan untuk mengakses (mendapatkan) nilai dari time-stamp counter suatu prosesor (mulai prosesor Pentium). Time-stamp counter merupakan suatu counter yang secara terus menerus melakukan perhitungan (pertambahan) pada setiap clock cycle yang terjadi pada prosesor. Time-stamp counter pada prosesor Intel terdiri dari 64-bit MSR (model specific register) yang akan bertambah terus setiap siklus (clock cycle). Ketika komputer direset, time-stamp counter diset kembali ke nol. Melalui time-stamp counter inilah kita bisa mendapatkan kecepatan prosesor.

Instruksi RDTSC (read time-stamp counter) terdiri dari dua byte intruksi (opcode) – 0Fh 31h –. Setelah dipanggil, instruksi ini akan “mengirimkan” nilai (time-stamp counter) ke register EDX:EAX. Umumnya yang akan dipakai adalah nilai low-nya saja (register EAX), kecuali kalau komputer yang bersangkutan sudah nyala selama berhari-hari.

Yang perlu dicatat adalah bahwa satuan time-stamp counter adalah “cycle”, bukan “waktu”. Sebagai contoh, lima ratus juta cycle pada prosesor yang memiliki kecepatan 500MHz sama dengan satu detik satuan waktu, dan jika pada prosesor yang 1000MHz (1GHz) akan sama dengan setengah detik. Sehingga, membandingkan jumlah cycle hanya masuk akal untuk prosesor dengan kecepatan yang sama. Kalaupun ingin membandingkan prosesor dengan kecepatan yang berbeda-beda, jumlah cycle harus dikonversi dulu ke dalam satuan waktu dengan rumus:

detik = cycle / 106

Sehingga, cycle bisa disamakan dengan frekuensi atau kecepatan prosesor.

Dari penjelasan di atas, kita dapat membuat suatu algoritma yang akan mendeteksi kecepatan prosesor yang terpasang. Algoritmanya adalah sebagai berikut:
Ambil time-stamp counter dan simpan di variabel A.
Biarkan komputer berhenti 1 detik (1000 milidetik), dengan tujuan agar isi counter bertambah.
Kemudian, ambil time-stamp counter lagi, tetapi sekarang simpan di variabel B.
Cari selisih antara variabel A dan B untuk kemudian dibagi dengan 106. Hasilnya adalah kecepatan prosesor.

Untuk lebih lengkapnya, berikut potongan sourcecode-nya:

...
asm
dw 310Fh //RDTSC
mov TimerA, eax //yg diambil nilai low-nya, kecuali komputernya
//nyala terus berhari-hari
end;
Sleep(1000); //delay 1 detik
asm
dw 310Fh //RDTSC kedua
mov TimerB, eax
end;
CPUSpeed := (TimerB-TimerA)/1000000;
...
Sebagai contoh buatlah sebuah form yang terdiri dari 2 komponen Label dan sebuah komponen Edit. Untuk Edit beri nama dengan edSpeed. Sedangkan untuk Label, cukup isi saja Caption-nya seperti gambar 1. Kemudian pada event OnShow form Anda, tulis listing di bawah ini:
procedure TForm1.FormShow(Sender: TObject);

//fungsi untuk mendeteksi kecepatan prosesor
function GetCPUSpeed: real;
var
TimerA, TimerB : DWORD;
begin
asm
dw 310Fh //RDTSC
mov TimerA, eax //yg diambil nilai low-nya, kecuali komputernya
//nyala terus berhari-hari
end;
//tunda dulu selama 1 detik u/ mengupdate time-stamp counter
Sleep(1000);
asm
dw 310Fh //RDTSC
mov TimerB, eax
end;

Result := (TimerB-TimerA)/1000000;
end;

begin
edSpeed.Text := Format('%-4.0f MHz', [GetCPUSpeed]);
end;

Tidak ada komentar: