Mengapa kita tidak memiliki lebih banyak register di mikroprosesor?

18

Secara teori register tidak diperlukan; semua mikroprosesor akan tetap berfungsi tanpa register. Namun penambahan yang tampaknya sepele ini telah membantu membuat mikroprosesor lebih efisien.

Mengapa kita tidak bisa memiliki lebih banyak register untuk mendapatkan manfaat lebih lanjut dari mereka? Mereka hanya memori pada chip dan bisa dibayangkan tidak terlalu sulit untuk ditambahkan? Faktor apa yang memengaruhi jumlah register menjadi seperti sekarang dan bukan, katakanlah 10x lebih banyak?

Darshan Chaudhary
sumber
8
@ Alper91 Banyak arsitektur, hipotetis dan nyata, tidak memiliki register, dan itu sama sekali tidak perlu. Ini hanya optimasi yang bermanfaat.
pipa
4
Hmm. Tidak ada yang menyebutkan Sparc. Implementasi terbesar bisa memiliki 520 register di dalamnya (32 windows kali 16 register, + 8 global.) Saya yakin ingat mereka.
jonk
13
Saya pikir jumlah bit dalam instruksi yang Anda butuhkan untuk menentukan register adalah masalah besar. Jika Anda memiliki 1024 register, maka Anda memerlukan setidaknya 30 bit untuk setiap instruksi aritmatika - kecuali jika Anda menambahkan batasan lain seperti "semua 3 register harus dari grup yang sama dengan 32 (dalam hal ini Anda memerlukan 20 bit)
user253751
8
@pipe - sebenarnya hampir semua desain praktis membutuhkan "register" dalam arti skematis, karena bahkan jika Anda membangun mesin stack atau sesuatu seperti itu, Anda harus memiliki tempat untuk menyimpan argumen ke ALU, atau outputnya - sebagian besar memori tidak memiliki tiga port akses. Dan mesin stack membutuhkan pointer stack yang ... register! Dan jangan menyebutkan register pipa. Anda dapat menyembunyikan penggunaan "register" seperti itu dari programmer, tetapi Anda masih membutuhkannya, dan mungkin hampir sebanyak mesin register primitif.
Chris Stratton
4
@ ChrisStratton Tentu, tetapi selama mereka tidak diekspos melalui ISA, itu hanyalah detail implementasi. Argumen yang agak tidak berarti, karena kita tidak tahu apa artinya OP dengan mendaftar .
pipa

Jawaban:

33

Ada beberapa faktor:

  • mikro-arsitektur berkinerja tinggi menggunakan pengubahan nama register. Artinya, jumlah register fisik lebih tinggi dari jumlah register yang terlihat secara arsitektur dan mereka dapat melacak penggunaannya secara independen.

  • menggandakan jumlah register tidak menggandakan kinerja. ISTR (dari arsitektur Komputer, Pendekatan Kuantitatif ) yang beralih dari 16 menjadi 32 register membawa peningkatan seperti 10% dengan asumsi bahwa peningkatan tersebut tidak memiliki efek yang merugikan (yang merupakan asumsi yang sangat optimis).

  • register yang terlihat secara arsitektur memiliki biaya. Contohnya:

    • Menambah jumlah mereka meningkatkan jumlah bit yang diambil dalam format instruksi untuk menunjukkan register mana yang sedang ditindaklanjuti (menggandakan jumlah register menyiratkan untuk memiliki satu bit lebih per register dalam format, sehingga mencegah untuk menggunakan bit-bit itu untuk penggunaan lain atau memaksa. ukuran instruksi yang lebih panjang).
    • Meningkatkan jumlah register arsitektur meningkatkan biaya switching konteks (karena mereka harus disimpan dan dikembalikan pada switch konteks).
Pemrogram
sumber
1
Saya bertaruh bahwa peningkatan kinerja dari 16 menjadi 32 register sangat bergantung pada potensi optimisasi dari kompiler yang dimaksud. Di assembler, memiliki akses untuk menggandakan jumlah register (dalam arsitektur x64) dapat sangat meningkatkan kinerja - tetapi hanya untuk peran khusus, dan hanya jika mereka benar-benar digunakan.
rdtsc
6
@rdtsc: mulai dari 8 hingga 16 register arsitektur memberikan peningkatan besar dalam jumlah tumpahan / isi ulang untuk kode tipikal, menurut data dari simulasi dalam makalah yang dihubungkan dari jawaban ini . Ini memengaruhi ukuran kode, jumlah instruksi, dan seberapa pentingkah penerusan toko latensi rendah. 16-> 32 adalah efek yang jauh lebih kecil. AFAICT, 16 register arsitektur adalah pilihan yang baik untuk perangkat keras dengan penggantian nama register untuk menghilangkan bahaya WAR dan WAW.
Peter Cordes
2
Namun, Intel AVX512 menambahkan 16 reg vektor lagi, dengan total 32. (Serta menggandakan lebarnya menjadi 64 byte, garis cache penuh). Menyembunyikan latensi dari throughput tinggi, operasi FP latensi tinggi dapat mengambil banyak register. misal Intel Haswell memiliki 5c lat, satu per 0,5c throughput FMA, jadi Anda memerlukan 10 akumulator vektor untuk menjenuhkan unit eksekusi FMA untuk reduksi (mis. produk titik, atau menjumlahkan array, di mana FMA merupakan bagian dari ketergantungan yang dibawa loop) ). x86-64 hanya memiliki 16 reg vektor. Tapi ingat, op integer, esp. pada reg dokter umum, jarang memiliki latensi lebih dari 1c.
Peter Cordes
1
Trade-off berbeda untuk register integer, FP dan vektor. Misalnya malas menyimpan / mengembalikan register integer tidak masuk akal, melakukannya untuk vektor satu adalah taruhan yang jauh lebih baik. Dan vektor ISA memiliki register lebih sering daripada integer (AltiVec memiliki setidaknya hingga 128, ISTR telah membaca sekitar 256 satu untuk Sparc tetapi tidak dapat menemukan referensi sekarang).
Pemrogram
1
en.wikipedia.org/wiki/AltiVec memiliki tiga puluh dua vektor reg 128b. Saya jadi penasaran dengan SPARC dan mencari tahu bagaimana register-window-nya berfungsi untuk switch konteks. Ini memiliki 32 register yang terlihat sekaligus, tetapi menggunakan jendela geser ke file register yang lebih besar. Kedengarannya dari versi yang disederhanakan ini seperti OS perlu mengetahui ukuran seluruh file register sliding-window untuk menyimpan / mengembalikannya, karena meskipun instruksi window-slide menyediakan memori untuk menyimpan / mengembalikan regs jika diperlukan, itu dilakukan dengan menjebak ke OS.
Peter Cordes
16

Walaupun register dan RAM adalah memori, keduanya diakses dengan cara yang berbeda, untuk mencerminkan biaya (dalam area chip, atau siklus clock tersembunyi) untuk mengaksesnya.

Register terikat erat dengan ALU, dan dapat mengambil banyak peran sumber data, sink, modifier dll. Karena itu mereka membutuhkan banyak koneksi multiplex yang luas. Dalam beberapa arsitektur kita dapat menulis R1 <= R2 + R3, dan itulah yang terjadi dalam satu siklus clock tunggal. Setiap register ditangani secara langsung dalam kode op, pengalamatan ini adalah sumber daya yang sangat terbatas.

Karena register mahal untuk diimplementasikan, jumlahnya biasanya terbatas pada urutan 10/20 di sebagian besar arsitektur.

RAM terikat secara longgar ke CPU, biasanya disalurkan melalui satu koneksi bersama. Ini membuatnya jauh lebih murah untuk mengimplementasikan sejumlah besar RAM. Alamat RAM umumnya berasal dari alamat yang disimpan, jadi jangan mengkonsumsi lebar instruksi yang signifikan.

SPARC adalah arsitektur yang menarik, dengan register 72 hingga 640 64 bit, dengan konteks register 32 yang dapat digeser dengan tumpang tindih untuk panggilan subrutin cepat dengan melewati parameter. Anda cenderung tidak menemukannya di PC dan server tempat masalah biaya, seperti pada 99,999% aplikasi.

Neil_UK
sumber
4
Aspek lain adalah Anda harus menyimpan / mengembalikan register selama saklar konteks. Lebih banyak register, lebih banyak waktu.
Michel Billaud
Saya ingin mencatat bahwa TMS9900 lama menyimpan semua register yang berfungsi dalam memori eksternal en.wikipedia.org/wiki/Texas_Instruments_TMS9900
Peter Smith
1
Saya telah memenuhi syarat 'selalu' dengan (kecuali beberapa tweak) tetapi membawanya keluar untuk menyederhanakannya. Mungkin saya hanya akan mengubahnya ke 'umumnya'. Pada dasarnya jika Anda dapat menemukan dan memahami pengecualian, Anda tidak perlu saya tunjukkan. Jika Anda cukup naif untuk disesatkan, maka itu tidak masalah, karena itu tidak akan membuat Anda kesulitan. TMS9900, itu aneh, aku punya 99/4 untuk dosaku di kehidupan sebelumnya, binatang aneh!
Neil_UK
Itanium juga memiliki register windows.
Simon Richter
1
@ ChrisStratton: Walaupun ada beberapa preseden untuk "Anda tidak dapat menggunakan register X dan Y" dianggap sebagai bagian dari "ABI" (mis. Register k0 dan k1 pada mips), itu adalah penggunaan yang tidak biasa. Tentu saja ada saluran pesan rahasia yang tidak diinginkan / tidak aman di antara proses jika menyimpan / mengembalikan "register terlarang ABI" ini tidak dilakukan pada saklar konteks. Artinya, proses yang seharusnya tidak dapat berkomunikasi mungkin dapat melakukannya dengan menyimpan informasi dalam register terlarang dan menunggu switch konteks.
R ..
12

Register harus dikagumi dalam instruksi. Jika ada banyak register, instruksi lebih panjang. Menyimpan dan memulihkan konten register untuk layanan interupsi membutuhkan lebih banyak waktu jika ada banyak register.

Uwe
sumber
5

Seperti kebanyakan hal, jumlah register adalah kompromi antara biaya, kompleksitas dan kegunaan.

Register diimplementasikan sebagai multi-port static RAM, yang membuatnya lebih mahal (area chip) daripada opsi penyimpanan lainnya.

Kemudian mereka digabungkan dengan set instruksi prosesor, meningkatkan jumlah register meningkatkan kompleksitas set instruksi. Jadi jika Anda ingin tetap kompatibel dengan set instruksi, Anda tidak bisa hanya meningkatkan jumlah register yang tersedia di prosesor generasi berikutnya untuk meningkatkan efisiensi, program tidak akan menggunakannya.

Berikutnya adalah berapa banyak register yang benar-benar Anda butuhkan? Ada batas kegunaannya. Pertimbangkan Anda menulis sebuah algoritma yang melakukan beberapa operasi matematika pada 1024 byte, katakanlah kalikan dengan 5. Dengan jumlah register saat ini, Anda berakhir dengan sesuatu seperti:

load operand1=5
load address
loop: load operand2=byte1@address
multiply Register1 with Register2
store result
increment address
if address = end goto endLoop
jump loop
endLoop:

Sekarang jika Anda memiliki 1024 register dan semua data disimpan di sana, program Anda akan terlihat seperti:

multiply Register1 with Register2
multiply Register1 with Register3
multiply Register1 with Register4
multiply Register1 with Register5
multiply Register1 with Register6
...

Karena masing-masing dari mereka adalah instruksi yang berbeda, masing-masing dari mereka harus dituliskan. Jadi memori program yang Anda butuhkan meledak. Setelah menyadari ini, Anda mungkin ingin memperkenalkan beberapa instruksi seperti multiply register1 with register(2 to 256),. Tetapi kapan Anda akan berhenti, apakah Anda memberikan instruksi untuk semua kombinasi?

Jadi mungkin angka-angka yang kami miliki saat ini merupakan trade-off yang baik antara biaya, kompleksitas dan kegunaan.

Gudang senjata
sumber
1
Saya pikir program multiply Register1 with Register2 multiply Register1 with Register3ini sangat tidak realistis karena data pasti datang langsung atau tidak langsung dari luar komputer, sehingga register perlu dimuat, dan hasilnya perlu digunakan di suatu tempat, langsung atau tidak langsung, sehingga register perlu disimpan. Pada kenyataannya, kompiler pengoptimal yang layak untuk bahasa tingkat tinggi akan 'membuka gulungan' program pertama untuk membuat sesuatu seperti program kedua, mengoptimalkan penggunaan register, latensi memori, mungkin penyimpanan hunian cache dan kecepatan eksekusi.
gbulmer
1
Tidak perlu banyak multiply register1 with register(2 to 256)instruksi tujuan khusus . Pipelining meningkatkan throughput CPU secara signifikan terutama untuk lebih mudah memecahkan kode dan menjalankan instruksi. Jadi efek dari berbagai instruksi yang kompleks dan masif dapat dicapai dengan menggunakan beberapa instruksi sederhana dengan tingkat eksekusi yang lebih tinggi. Memiliki jumlah register yang lebih besar membantu dengan memungkinkan kompiler menghasilkan banyak instruksi independen (yang tidak membagikan register), yang dapat diselesaikan secara independen, meningkatkan throughput. Contoh Anda = lebih banyak register lebih baik.
gbulmer
4

Registrasi sangat mahal. Sangat mahal. Tidak begitu banyak register sendiri, itu semua koneksi dari dan ke register. Katakanlah Anda memiliki instruksi reg1 = reg2 + reg3. Untuk mengimplementasikan ini dengan cepat , Anda perlu membaca data dari dua register dalam satu siklus, dan menulis ke register lain pada siklus kedua. Sekarang jika Anda memiliki prosesor yang dapat menjalankan beberapa instruksi per siklus, katakan tiga instruksi, Anda harus dapat membaca data dari enam register setiap siklus, dan menulis data ke 3 register. Itu koneksi yang sangat cepat, sangat buruk.

Tentu saja Anda bisa menggunakan lebih banyak transistor. Masalahnya adalah: Kecepatan turun. Anda memerlukan lebih banyak perangkat keras untuk dipilih dari lebih banyak register. Ruang untuk file register semakin besar. Semua itu membuat segalanya lebih lambat. Jadi dengan teknologi yang sama, Anda mungkin dapat memiliki 16 register dan berjalan pada 2.600 MHz atau memiliki 32 register dan berjalan pada 2.400 MHz. Sekarang register tambahan harus menebus penurunan kecepatan clock yang signifikan.

gnasher729
sumber
2

Faktor apa yang mempengaruhi jumlah register

- Memory Hierarchy

Register, Cache, RAM semuanya diimplementasikan dengan teknologi penyimpanan yang berbeda.

Teknologi yang berbeda berbeda dalam

  1. Waktu akses
  2. Biaya
  3. Massa jenis

Contoh: Register internal yang ditemukan dalam CPU adalah Memori Akses Acak Statis , sedangkan memori utama komputer adalah Memori Akses Acak Dinamis

Sel biner RAM Statis diimplementasikan menggunakan sirkuit 6-transistor, sedangkan sel biner RAM Dinamis diimplementasikan menggunakan kapasitor dan transistor. Membandingkan SRAM dan DRAM

  • Memori SRAM jauh lebih cepat daripada memori DRAM [Beberapa siklus untuk mengakses SRAM dibandingkan dengan DRAM]
  • Sirkuit SRAM mengkonsumsi daya lebih sedikit daripada DRAM
  • DRAM membutuhkan penyegaran setiap bit dalam memori secara berkala tidak seperti SRAM
  • Biaya SRAM lebih dari DRAM
  • SRAM memiliki kepadatan yang lebih rendah dibandingkan dengan DRAM

Jadi bukan hal yang praktis untuk menambah jumlah memori yang cepat, mahal, dan kurang kepadatan. Bahkan kita mungkin menggunakan beberapa dari mereka dan program yang ditulis dengan baik akan menyimpan data yang paling sering digunakan di dalam register cepat ini sementara data yang lebih jarang digunakan disimpan dalam memori yang lebih lambat.

- Panjang instruksi

Alamat register termasuk dalam instruksi, yang membatasi jumlah register yang dapat diakses berdasarkan jumlah bit yang dapat mewakili alamat. Misalnya dalam arsitektur MIPS 32-bit panjang instruksi memegang hanya 5-bit untuk mewakili alamat dari register dapat diakses yang membatasi jumlah register untuk 2 5 = 32 mendaftar. Meningkatkan jumlah register akan membutuhkan peningkatan panjang instruksi untuk memasukkan bit yang cukup yang dapat mengakses semua register.

Elbehery
sumber
2

Jika Anda melihat kumpulan instruksi prosesor, ada beberapa cara untuk mengelompokkannya. Misalnya, semua ADDinstruksi dapat dikelompokkan bersama, dan semua XORinstruksi.

Dalam setiap grup dari instruksi yang sama, mungkin ada versi yang beroperasi pada memori, atau pada register. Sub-pengelompokan inilah yang secara efektif menentukan jumlah register yang dimiliki prosesor.

Sebagai contoh hipotetis 8-bit, misalkan $Axinstruksinya mungkin ADDinstruksinya, dan $Cxmungkin XORinstruksinya. Dengan desain ini, hanya ada empat bit yang tersisa untuk menentukan operan!

  • Seseorang mungkin hanya memiliki empat register tujuan umum, dan menggunakan dua bit untuk mendefinisikan satu, dan dua bit untuk mendefinisikan yang lain.
  • Atau, seseorang mungkin menggunakan bit pertama untuk membedakan varian "khusus", dan 3 bit lainnya untuk menentukan yang mana dari delapan register yang beroperasi dengan akumulator ( $x0bisa juga akumulator itu sendiri).
  • Atau, seseorang dapat memiliki lebih dari jumlah register ini - tetapi kemudian batasi register mana yang dapat diakses oleh instruksi mana.

Tentu saja, kita melewati set instruksi 8-bit. Tapi tetap saja, logika ini membantu mendefinisikan set register di masa lalu - itu akan terus melakukannya di masa depan.

EDIT (seperti yang diminta)

Mengatakan empat bit untuk instruksi: ADD, SUB, XOR, MOV, CMPdll Ada 16 kemungkinan di sini. Kemudian, untuk instruksi-instruksi itu di mana register-to-register masuk akal (misalnya ADD Rx,Ry), Anda perlu menentukan Rxdan Ry. Katakanlah dua bit berikutnya adalah untuk x, dan dua bit terakhir adalah untuk y. Jadi:

ADD R1, R2  =>  'ADD' + 'R1' + 'R2' => $A0 + $04 + $02

Dengan hanya dua bit untuk mendefinisikan register seperti ini, Anda hanya memiliki ruang untuk total empat register!

Sebagai tambahan, Anda akan mencatat bahwa beberapa kombinasi register tidak masuk akal. Misalnya, MOV Rx, Rx(tidak melakukan apa-apa) dan SUB Rx, Rx(selalu menghasilkan 0). Ini bisa menjadi instruksi kasus khusus:

  1. SUB Rx, Rxbisa menjadi NOT Rx- instruksi operan tunggal.
  2. MOV Rx, Rxbisa menjadi MOVinstruksi yang menggunakan byte kedua sebagai nilai langsung, diartikan sebagai MOV Rx, #$yy.

Dengan cara ini Anda dapat "bermain" dengan peta instruksi, mengisi lubang untuk instruksi yang tidak berguna atau tidak masuk akal untuk memberikan set instruksi yang lebih besar untuk programmer. Tetapi pada akhirnya, set instruksi mendefinisikan set register.

John Burger
sumber
Saya masih bingung, dapatkah Anda menjelaskan bagaimana hanya 4 bit yang tersisa untuk operan?
Darshan Chaudhary
Periksa jawaban saya yang diperbarui
John Burger
1
IMHO jawaban ini akan meningkat secara signifikan dengan menggerakkan " contoh hipotetis mengasumsikan kumpulan instruksi 8-bit " ke awal pertanyaan. Saya menyia-nyiakan waktu untuk mencoba memahaminya, menyimpulkan itu hanya masuk akal untuk instruksi 8-bit, panjang tetap, kemudian membaca terus untuk menemukan bahwa itulah masalahnya. IMHO, instruksi semacam itu tidak sangat tidak relevan dalam konteks pertanyaan; seluruh ruang alamatnya bisa ditambah dengan RAM statis. Saya juga berpikir bagian awal " Beberapa kombinasi register tidak masuk akal ... " tidak relevan dengan pertanyaan, dan dapat dihapus. $ 0,02 saya
gbulmer
-2

Intel menggunakan ribuan register saat ini - ratusan per inti CPU. Tetapi jumlah terbesar data yang disimpan pada CPU adalah dalam cache, yang secara tidak langsung menjawab pertanyaan. Cache disusun berlapis-lapis, dengan cache L1 kecil cepat dan cache L2 dan L3 lebih jauh lebih jauh. File register dalam arti adalah L0, bahkan lebih cepat dari L1 tetapi juga lebih kecil. Jadi, Anda dapat menambah jumlah register, tetapi itu kemungkinan akan memperlambatnya.

MSalters
sumber