Apakah komputer benar-benar menggunakan add-lookahead adders?

12

Ada banyak detail tentang carry addahead adders seperti Kogge-Stone, Lander-Fischer, dll dalam kursus CS perguruan tinggi. Mereka digambarkan sebagai "umum di industri". Namun, saya tidak dapat menemukan bukti (selain dari mungkin rantai pembawa Manchester) dari waktu belakangan ini bahwa mereka sebenarnya digunakan di mana saja secara khusus. Pencarian Google hanya mengembalikan halaman jurnal dan penelitian akademis. Paling-paling, implementasi hipotetis diberikan.

Pertanyaan saya adalah, apakah ada tempat / implementasi khusus yang menggunakan add-lookahead adders digunakan? Atau apakah mereka tidak relevan dengan dunia nyata?

qwr
sumber
1
Waktu siklus prosesor berkinerja tinggi dan siklus tunggal mereka menambah latensi tentu menunjukkan mereka tidak menggunakan riak-carry (tapi ini akan memungkinkan carry-pilih). Bahkan untuk proses 22nm dari Intel, melakukan rip melalui 64 bit dalam waktu kurang dari 300ps mungkin mustahil.
Paul A. Clayton
@ PaulA.Clayton Saya mendapatkan kesan dari melihat melalui beberapa lembar data yang digunakan sebagai carry-select atau decoder-like adders.
qwr

Jawaban:

16

Ini adalah pertanyaan langsung dengan jawaban yang sangat kompleks.

Pertama, beberapa latar belakang.

Desain VLSI dunia nyata adalah bidang yang sangat teknis yang menampilkan keseimbangan pertukaran yang terus berubah. Waktu yang dibutuhkan suatu rangkaian untuk menghitung jawaban jarang merupakan satu-satunya faktor penting. Ada juga power draw dan area fisik, ditambah banyak faktor yang mengungkapkan bahwa rangkaian yang Anda desain sebenarnya analog (misalnya resistansi kawat, kapasitansi parasit). Semua ini penting dalam rangkaian nyata dan dapat memengaruhi desain mana yang dipilih.

Kedua, Anda harus mempertimbangkan seluruh siklus hidup suatu proyek. Adder yang sesuai untuk realisasi VLSI mungkin tidak sesuai untuk realisasi FPGA. Jika desain akan melalui fase yang sedang diuji pada FPGA ... Anda mendapatkan gambar.

Ketiga, tidak setiap penambah dibuat sama. Pada CPU tipikal, ada banyak adders nongkrong yang melakukan tugas yang berbeda; mungkin ada beberapa bilangan bulat ALU, sebuah floating point mantissa adder, sebuah adder yang melakukan perhitungan alamat, sebuah adder yang menghitung target cabang, dan sebagainya. Itu tidak termasuk penambahan carry-save yang Anda temukan di unit multiplikasi modern. Masing-masing memiliki kekhasan dan kendala tersendiri.

Perhitungan target cabang, misalnya, biasanya melibatkan penambahan konstanta kecil ke kata penuh, yang menyarankan desain penambah yang berbeda dari yang menambahkan dua kata penuh secara bersamaan. Demikian pula, penambahan floating point membutuhkan langkah pembulatan pasca-penambahan yang mungkin membutuhkan waktu kurang dari satu siklus, jadi tidak ada alasan mengapa Anda tidak bisa mencuri sisa siklus untuk menyelesaikan penambahan.

Terakhir, dan mungkin yang paling penting, para pemain besar (misalnya Intel, AMD, NVIDIA) cukup bungkam tentang detail implementasi tingkat rendah untuk alasan yang jelas, kecuali mereka berpikir mereka bisa mendapatkan kertas dan / atau paten dari itu. Meski begitu, Anda sering tidak dapat memastikan apa yang sebenarnya mereka lakukan tanpa rekayasa balik.

Karena itu, ada beberapa hal yang kita tahu.

Hal utama yang perlu Anda sadari adalah bahwa metode carry-lookahead adalah blok bangunan, dan belum tentu metode itu sendiri. Sebuah analogi mungkin ada di sini.

Jika Anda berpikir tentang kelas algoritme, Anda mungkin mempelajari banyak algoritma penyortiran seperti penyortiran cepat, penggabungan penggabungan, penyisipan, dan sebagainya. Di dunia nyata, jika penyortiran adalah hambatan kinerja, setiap insinyur yang baik akan menganggap ini sebagai blok bangunan primitif yang darinya penyortiran "nyata" dapat dibangun.

Algoritma pengurutan dari pustaka standar GNU C ++, misalnya, menggunakan pengurutan cepat, menggunakan pengurutan penyisipan ketika intervalnya cukup kecil. Namun, jika setelah beberapa melewati sepertinya semacam partisi cepat telah mengenai perilaku patologis, itu kembali ke tumpukan tumpukan. Itulah tiga algoritma pengurutan yang berbeda untuk membuat satu jenis kekuatan industri.

Hal yang sama berlaku untuk sirkuit adder. Diketahui, misalnya, bahwa unit integer Pentium 4 menggunakan penambah Han-Carlson, yang merupakan campuran dari Kogge-Stone dan Brent-Kung. (Han-Carlson sangat menarik, karena ini merupakan "sweet spot" dalam pertukaran antara penundaan propagasi dan area mati yang juga cukup hemat daya.) Sering kali membayar untuk menggunakan campuran beberapa metode.

Adders carry-lookahead "Murni" masih merupakan norma di sirkuit yang disintesis (misalnya jika Anda memberi makan operator Verilog "+" ke Cadence atau Synopsys), ketika datang ke desain tangan, CPU modern kelas atas dengan superscalar out- mesin eksekusi pesanan tampaknya bergerak ke arah desain yang sedikit berbeda untuk unit integer mereka.

Adder spekulatif adalah sirkuit yang memiliki keterlambatan propagasi sangat rendah, tetapi hanya berfungsi dengan benar pada beberapa waktu (95% dari waktu adalah tipikal), dan dimungkinkan untuk mengetahui dengan logika yang sangat sedikit apakah spekulan adder mengembalikan hasil yang benar atau tidak. Jadi idenya adalah melakukan penambahan spekulatif dan setengah dari penambahan carry-lookahead secara paralel, dalam satu siklus. Jika spekulan penambah mengembalikan jawaban yang benar, instruksi dilakukan. Jika tidak, hentikan jalur pipa dan lakukan separuh tambahan yang akurat.

Karena Anda tahu bahwa jalan lambat akan membutuhkan dua siklus, perancang dapat menggunakan metode yang lebih hemat ruang dan hemat daya meskipun itu akan terlalu lambat untuk penggunaan umum.

Nama samaran
sumber
6

Ya, banyak komputer menggunakan add-lookahead adders. Saya telah merekayasa ulang beberapa mikroprosesor lama dan saya dapat memberikan beberapa contoh.

ALU pada Intel 8008 (prosesor 8-bit pertama mereka) termasuk sirkuit carry-lookahead besar yang diimplementasikan dengan logika dinamis. Sirkuit ini mengambil ruang mati sebanyak ALU itu sendiri. Carry lookahead ditunjukkan pada lembar data 8008 , angka 3. Saya belum melihat prosesor tahun 1970-an lainnya dengan carry-lookahead untuk ALU, sehingga 8008 agak tidak biasa dalam hal ini.

6502 menggunakan primitif carry-lookahead untuk incrementer program counter (PC). Ini mendeteksi jika akan ada carry dari byte bawah PC dan menggunakannya untuk meningkatkan byte atas. Ini mengurangi ripple carry dari berpotensi 16 bit menjadi 8 bit. ALU 6502 menggunakan ripple carry, meskipun logika carry dibalik untuk bolak bit, yang memotong inverter keluar dari jalur dan membuatnya sedikit lebih cepat.

Z-80 memiliki incrementer / decrementer 16-bit yang digunakan untuk pembaruan PC, instruksi inc / dec, dan penghitung putaran. Ini menggunakan struktur carry-skip sehingga membawa dihitung untuk kelompok dua bit. Selain itu, ia menggunakan beberapa carry-lookahead untuk menghasilkan carry dari bits 0-7, 7-11, dan 12-14. Pembawa lainnya dihitung dengan ripple carry ( detail ). ALU Z-80, secara mengejutkan, adalah 4 bit, sehingga setiap operasi 8-bit melakukan dua kali melewati ALU.

8085, di sisi lain, menggunakan ripple carry untuk incrementer / decrementer 16-bitnya. Tapi seperti 6502, ia mendapat sedikit speedup dengan membalikkan carry logika dalam bit bergantian.

The ARM-1 memiliki ALU 32-bit tanpa membawa-LookAhead, hanya riak carry. Ini juga menggunakan trik membalikkan carry dalam bit bergantian.

Dalam dunia komputer mini, banyak prosesor dibangun dari chip ALU 74181 4-bit yang terkenal, yang memiliki internal carry lookahead. Contohnya termasuk Data General Nova, Xerox Alto, VAX-11/780 dan TI-990. (Lihat daftar Wikipedia yang lebih panjang .) Beberapa riak bekas ini membawa antara setiap 4-bit chip dan beberapa menggunakan 74182 carry chip lookahead untuk lookahead penuh.

Untuk meringkas, mikroprosesor yang berbeda menggunakan berbagai teknik carry tergantung pada tujuan kinerja mereka dan operasi apa yang ada di jalur kritis. ALU dapat menggunakan carry-lookahead penuh (seperti 8008) atau bahkan bisa berukuran setengah (seperti Z-80). Incrementer dapat menjadi masalah kinerja karena biasanya 16 bit dalam prosesor 8-bit, menghasilkan dua kali penundaan riak. Incrementer dapat memiliki riak carry (8085), satu carry lookahead (6502) atau beberapa membawa tahap lookahead (Z-80).

Ken Shirriff
sumber