Mengetahui Kecepatan Prosesor dengan Instruksi RDTSC 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;
Gambar 1. Informasi kecepatan prosesor. Sebagai bahan perbandingan, penulis mencoba mengambil hasil pendeteksian dari System Properties-nya Windows pada gambar berikut.
Gambar 2. Hasil pendeteksian prosesor pada System Properties milik Windows. Source code dari program ini bisa di-download pada bagian akhir dari tulisan ini.