deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

Intel 8087'nin içinde: kayan nokta toplama ve çıkarma gerçekte nasıl çalışıyordu

Intel 8087'nin çip düzeyinde sökülüp incelenmesi, 1980 tarihli matematik yardımcı işlemcisinin significand hizalamayı, sonuçları normalleştirmeyi ve özel değerleri nasıl ele aldığını — ve bu mekaniklerin sayısal yazılım için hâlâ neden önemli olduğunu açıklıyor.

Intel 8087'nin içinde: kayan nokta toplama ve çıkarma gerçekte nasıl çalışıyordu

8087'nin aritmetik motoruna yakından bakış

righto.com'da yayımlanan ve şu anda Hacker News'in ana sayfasında öne çıkan ayrıntılı bir inceleme, Intel'in 8087 matematik yardımcı işlemcisinin kayan nokta toplama ve çıkarmayı mikrokod ve tek tek devreler düzeyinde nasıl gerçekleştirdiğini ele alıyor. Yazar, çipin iç yapısını haritalamak için bir paketin kapağını kesmeyle açmış ve kalıbı mikroskop altında fotoğraflamış; tek tek fonksiyonel blokları seçebilecek kadar keskin görüntüler elde etmiş.

1980'de tanıtılan 8087, IBM PC ve diğer 8086 tabanlı sistemler için matematik işlemlerini hızlandırdı. Yazıya göre, toplama işlemlerini ana işlemciden neredeyse 100 kat daha hızlı gerçekleştiriyordu; daha karmaşık işlemlerde kazanç daha da büyüktü. Çip ayrıca tanjant, karekök ve logaritma hesaplayabiliyordu, ancak makale odağını en temel iki işleme daraltıyor.

Kalıp üzerindeki bloklar

İki bölge öne çıkıyor. Kalıbın ortasındaki mikrokod ROM'u, çipi sıralayan 1.648 mikrokomutu saklarken, alt yarısı 80-bit değerler üzerinde hesap yapan devre olan datapath'tir.

Datapath'ın çekirdeği bir tam sayı toplayıcısıdır. Bir işleneni B yazmaçından, diğerini ise stack yazmaçlarından veya geçici yazmaçlardan alır ve çıktısını bir toplam yazmaçına bırakır. Bir değeri tek işlemde istenen sayıda bit konumu kadar kaydırabildiği için fiziksel olarak büyük olan bir shifter, kayan nokta matematiğinin gerektirdiği hizalama ve normalleştirme kaydırmalarını gerçekleştirir; öndeki sıfır bitleri sayarak bunların kaydırılıp atılmasını sağlayan devre de buna yardımcı olur. Ayrı bir exponent dönüştürücüsü, üstleri (exponent) ayarlarken taşma ve alt taşmaları da işaretler.

Kayan nokta neden bir toplayıcıdan fazlasını gerektirir

Makalenin açıkladığı gibi, tam sayılar yalnızca sınırlı bir aralığı kapsar — 32 bitte kabaca eksi iki milyar ile artı iki milyar arası — ve kesirleri hiç ifade edemez. Kayan nokta, her iki sorunu da bir işaret biti, 1.bbb... biçiminde bir significand ve ikinin kuvveti olan bir üst (exponent) ile çözer; 32-bitlik kısa format bile 10^-36'nın altından 10^38'in ötesine uzanır.

İki değer birleştirilmeden önce ikili noktalarının hizalanması gerekir; tıpkı kalem-kâğıt aritmetiğinde ondalık noktaların alt alta getirilmesi gibi. Makaledeki 13.5 + 3.5 örneğinde, üstlerin eşleşmesi için küçük işlenen iki basamak sağa kaydırılır, sıradan bir tam sayı toplaması significandları birleştirir ve ortaya çıkan fazladan carry biti, sonuç bir basamak sağa kaydırılırken üst bir artırılarak çözülür.

Çıkarma, hizalama adımını paylaşır ama karmaşıklık ekler. Sonuç pozitif, negatif veya tam olarak sıfır olabilir ve her iki girdiden de birkaç büyüklük mertebesi küçük olabilir; bu yüzden normalleştirme büyük bir sola kaydırma gerektirebilir. 8 eksi 7.5 için sonuç dört bit sola kaydırılır ve üst dört azalır. Negatif bir sonucun significand'ı pozitife çevrilir ve işareti ters çevrilir; sıfır sonucu ise normalleştirmeyi tamamen atlar ve işaretli bir +0 veya -0 döndürür.

Yazmaçlar, tag'ler ve yuvarlama bitleri

8087'nin içindeki her şey temporary real adı verilen 80-bitlik bir biçimde yaşar: bir işaret biti, 15 bitlik bir üst ve 64 bitlik bir significand. Üst, saklanan alanın pozitif kalması için 16.383'lük bir bias ile saklanır ve genişliği 10^4932'nin ötesindeki değerlere ulaşır.

Çip, stack olarak düzenlenmiş sekiz yazmaç sunar; her biri zero, valid, special veya empty tag'lerinden birini taşır. Special, sonsuzlukları, NaN'leri ve denormalize değerleri kapsar; empty tag ise donanımın stack taşmasını ve alt taşmasını algılamasını sağlar. tmpA ve tmpB adlı iki iç yazmaç, kendi tag bitleriyle 80-bit düzeni yansıtır; tmpC ise yalnızca 68 bitlik bir significand tutar: bir fazladan bit taşmayı emer, düşük basamaktaki üç guard, round ve sticky biti ise yuvarlamaya hizmet eder.

Makinenin kalbinde, tam da yuvarlama bitlerine ve fazladan yüksek basamak bitlerine yer açmak için 64 bitten geniş olan 69 bitlik bir tam sayı toplayıcısı bulunur. Tek bir tam sayı toplaması bile iki mikrokomut tüketir; ilki bir işlenen ve carry işleme ile yuvarlama davranışı gibi seçenekleri belirler. Mikrokomutların kendisi 16 bit genişliğindedir ve veri hareketini, koşullu sıçramaları ile alt yordam çağrılarını ve dönüşlerini kapsar.

Neden önemli

Bunların hiçbiri müzelik bir trivia değil. Üst hizalama, işlem sonrası normalleştirme, işaretli sıfırlar ve guard, round ile sticky bitleri, bugün de kayan nokta donanımının standart mekanizmaları olarak varlığını sürdürüyor; 8087'nin mikrokodunun özel durum olarak ele almak zorunda olduğu uç vakalar — çıkarmadaki iptal (cancellation) ve işlenenlerden çok daha küçük sonuçlar gibi — sayısal yazılım yazan geliştiricileri hâlâ şaşırtan aynı vakalar. İşlemin kaydırmalara, tam sayı toplamalarına ve üst muhasebesine indirilmesini izlemek, bir işlemcinin kesirli sayılarla gerçekte ne yaptığını kavramanın en açık yollarından biri.

  • #intel
  • #floating-point
  • #microcode
  • #hardware
  • #retro-computing

İlgili yazılar