Bagaimana register nol meningkatkan kinerja?

Pada MIPS ISA terdapat register nol ($r0) yang selalu memberikan nilai nol. Hal ini memungkinkan prosesor untuk:

  1. Setiap instruksi yang menghasilkan hasil yang akan dibuang dapat mengarahkan targetnya ke register ini
  2. Menjadi sumber 0

sumber dikatakan bahwa ini meningkatkan kecepatan CPUnya. Bagaimana cara meningkatkan kinerja? Dan apa alasan mengapa tidak semua ISA mengadopsi register nol ini?

$r0 bukan tujuan umum. Ini sudah terprogram ke 0. Apa pun yang Anda lakukan pada register ini, register ini selalu bernilai 0. Anda mungkin bertanya-tanya mengapa register seperti itu diperlukan di MIPS.

Perancang MIPS menggunakan benchmark (program yang digunakan untuk menentukan kinerja CPU), yang meyakinkan mereka bahwa memiliki register yang terpasang pada 0 akan meningkatkan kinerja (kecepatan) CPU dibandingkan tidak memilikinya. Tidak semua orang setuju bahwa register yang tertanam pada angka 0 itu penting, jadi tidak semua ISA memiliki register nol.


person dayuloli    schedule 09.07.2014    source sumber
comment
Mungkin register nol membuat CPU lebih cepat dalam arti memungkinkan banyak program ditulis dalam instruksi yang lebih sedikit.   -  person Konrad Lindenbach    schedule 09.07.2014


Jawaban (4)


Ada beberapa cara potensial untuk meningkatkan kinerja; tidak jelas mana yang berlaku untuk prosesor tertentu, tetapi saya telah mencantumkannya secara kasar dari yang paling mungkin hingga yang paling kecil kemungkinannya.

  1. Hal ini menghindari kemacetan pipa palsu. Tanpa register nol yang eksplisit, maka perlu untuk mengambil register, menghilangkannya, dan menggunakan nilainya. Ini berarti bahwa operasi penggunaan nol bergantung pada operasi zeroing, dan (bergantung pada seberapa kuat sistem penerusan pipa) mungkin pada nilai register yang di-nolkan sebelumnya. Arsitektur seperti x86, yang memiliki file register yang cukup kecil dan pada dasarnya memvirtualisasikan registernya agar tidak menimbulkan masalah, memiliki alat analisis bahaya yang sangat kuat. Hal yang sama umumnya tidak berlaku pada prosesor RISC.
  2. Operasi tertentu mungkin lebih dapat disalurkan jika dapat menghindari pembacaan register. Jika register nol eksplisit digunakan, fakta bahwa operan akan menjadi nol diketahui pada tahap dekode instruksi, bukan pada tahap pengambilan register. Dengan demikian, tahap pembacaan register dapat dilewati.
  3. Demikian pula, kemampuan untuk membuang hasil secara eksplisit menghindari kebutuhan akan tahap penulisan register.
  4. Operasi tertentu dapat menghasilkan mikrokode yang lebih sederhana ketika salah satu operannya diketahui nol, atau ketika hasilnya diketahui dibuang.
  5. Register nol yang eksplisit mengurangi tekanan pada pengoptimal kompiler, karena register tersebut tidak perlu terlalu berhati-hati dengan penetapan registernya (tidak perlu mengidentifikasi register yang tidak akan menyebabkan terhentinya proses baca atau tulis).
person Sneftel    schedule 11.07.2014
comment
Pada CPU yang lebih sederhana, ada keuntungan melakukan decoding jika ISA memerlukan opcode yang lebih sedikit. Memiliki register nol berarti mov-immediate to register dapat menjadi alias untuk ori dst, $zero, 1234 daripada memerlukan opcode sendiri. Pada ISA dengan FLAGS (tidak seperti MIPS), cmp dapat menjadi sub dengan $zero sebagai tujuan. - person Peter Cordes; 14.05.2019

Untuk setiap item Anda, inilah jawabannya.

  1. Pertimbangkan instruksi yang mewajibkan mengambil register untuk keluaran, di mana Anda ingin membuang keluaran ini. Biasanya, Anda harus memastikan bahwa Anda memiliki register gratis yang tersedia, dan jika tidak, masukkan beberapa register Anda saat ini ke dalam tumpukan, yang merupakan operasi yang mahal. Jelasnya, sering kali keluaran operasi dibuang, dan cara termudah untuk mengatasinya adalah dengan menyediakan register yang 'tidak terpakai'.
  2. Sekarang kita memiliki register yang belum terpakai, mengapa tidak menggunakannya? Sering kali Anda ingin menginisialisasi nol sesuatu atau membandingkan sesuatu dengan nol. Cara terbaiknya adalah pertama-tama menulis nol ke register itu (yang memerlukan instruksi tambahan dan literal untuk nol dalam kode mesin Anda, yang mungkin berbentuk 0x00000000 yang agak panjang) dan kemudian menggunakannya . Jadi, satu instruksi dikurangi dan sedikit ukuran program Anda juga.

Pengoptimalan ini mungkin tampak sepele dan mungkin menimbulkan pertanyaan 'seberapa besarkah hal tersebut benar-benar meningkatkan sesuatu?' Jawabannya di sini adalah operasi yang dijelaskan di atas tampaknya banyak digunakan pada prosesor MIPS Anda.

person Sanchises    schedule 11.07.2014
comment
Membuang keluaran suatu instruksi berguna pada x86 di mana instruksi memiliki efek samping seperti mengatur kode kondisi. Instruksi MIPS hanya memiliki satu keluaran, karena ini adalah arsitektur RISC, dan jarang sekali diperlukan untuk membuang keluaran instruksi. - person markgz; 15.07.2014

Konsep register nol bukanlah hal baru. Saya pertama kali menemukannya pada mainframe CDC 6600, yang berasal dari pertengahan hingga akhir tahun 1960-an. Dalam beberapa hal, ini adalah salah satu prosesor RISC pertama, dan merupakan komputer tercepat di dunia selama 5 tahun. Dalam arsitektur itu, register "B0" sudah tertanam agar selalu nol. http://en.wikipedia.org/wiki/CDC_6600

Keuntungan dari register seperti ini adalah menyederhanakan set instruksi. Ketika decoding dan orkestrasi set instruksi sederhana dan teratur dapat diimplementasikan tanpa mikrokode, hal ini akan meningkatkan kinerja. Selain itu, untuk 6600 seperti kebanyakan chip LSI saat ini, waktu yang dihabiskan sinyal untuk menempuh panjang "kabel" menjadi salah satu faktor kunci dalam kecepatan eksekusi, dan menjaga set instruksi tetap sederhana (dan menghindari mikrokode) memungkinkan lebih sedikit transistor , dan menghasilkan jalur sirkuit yang lebih pendek.

person Burt_Harris    schedule 16.07.2014

Register nol memungkinkan penyimpanan beberapa opcode saat merancang arsitektur set instruksi (ISA) baru.

Misalnya, spesifikasi RISC-V utama memiliki 32 instruksi semu yang bergantung pada register nol (lih. Tabel 26.2 dan 26.3). Instruksi semu adalah instruksi yang dipetakan oleh assembler ke instruksi nyata lainnya (misalnya, cabang-jika-sama-ke-nol dipetakan ke cabang-jika-sama). Sebagai perbandingan: spesifikasi RISV-V utama mencantumkan 164 opcode instruksi nyata (yaitu menghitung basis/ekstensi RV(32|64)[IMAFD], alias RV64G). Itu berarti tanpa register nol RISC-V RV64G akan menempati 32 opcode lebih banyak untuk instruksi tersebut (yaitu 20% lebih banyak). Untuk implementasi CPU RISC-V yang konkrit, rasio instruksi real-to-pseudo ini dapat bergeser ke arah mana pun bergantung pada ekstensi mana yang dipilih.

Memiliki lebih sedikit opcode menyederhanakan dekoder instruksi.

Decoder yang lebih kompleks memerlukan lebih banyak waktu untuk mendekode instruksi atau menempati lebih banyak gerbang (yang tidak dapat digunakan untuk unit CPU yang lebih berguna) atau keduanya.

ISA yang sudah ada dan dikembangkan secara bertahap harus berurusan dengan kompatibilitas ke belakang. Jadi, jika desain ISA asli Anda tidak menyertakan register nol, Anda tidak bisa menambahkannya begitu saja di revisi selanjutnya tanpa merusak kompatibilitas. Selain itu, jika ISA Anda yang ada sudah memerlukan decoder yang sangat kompleks, menambahkan register nol tidak akan membuahkan hasil.

Selain ISA RISC-V modern (dikembangkan sejak 2010, ratifikasi pertama pada tahun 2019), ARMv8 AArch64 (ISA 64 Bit yang dirilis pada tahun 2011), berbeda dengan ISA ARM 32 bit sebelumnya, juga dilengkapi register nol. Karena hal ini dan perubahan lainnya, ISA AArch64 memiliki lebih sedikit kesamaan dengan ISA ARM 32 Bit sebelumnya dibandingkan - katakanlah - ISA x86 dan x86-64.

Berbeda dengan AArch64, x86-64 tidak memiliki register nol. Meskipun x86-64 lebih modern dibandingkan ISA x86 32 bit sebelumnya, ISA-nya hanya berubah secara bertahap. Oleh karena itu, ia menampilkan semua opcode x86 yang ada ditambah varian 64 bit, dan dengan demikian dekodernya sudah sangat kompleks.

person maxschlepzig    schedule 28.12.2019