DE112011103195T5 - Funktionseinheit zur Berechnung von führenden Nullen von Vektoren, von abschließenden Nullen von Vektoren, der Anzahl von Einsen von Vektoroperanden und der Vektorparität - Google Patents

Funktionseinheit zur Berechnung von führenden Nullen von Vektoren, von abschließenden Nullen von Vektoren, der Anzahl von Einsen von Vektoroperanden und der Vektorparität Download PDF

Info

Publication number
DE112011103195T5
DE112011103195T5 DE112011103195T DE112011103195T DE112011103195T5 DE 112011103195 T5 DE112011103195 T5 DE 112011103195T5 DE 112011103195 T DE112011103195 T DE 112011103195T DE 112011103195 T DE112011103195 T DE 112011103195T DE 112011103195 T5 DE112011103195 T5 DE 112011103195T5
Authority
DE
Germany
Prior art keywords
vector
instruction
operand
functional unit
leading
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
DE112011103195T
Other languages
English (en)
Inventor
Jeff Wiedemeier
Sridhar Samudrala
Roger Golliver
Eric W. Mahurin
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Intel Corp
Original Assignee
Intel Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Intel Corp filed Critical Intel Corp
Publication of DE112011103195T5 publication Critical patent/DE112011103195T5/de
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/3001Arithmetic instructions
    • G06F9/30014Arithmetic instructions with variable precision
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/3001Arithmetic instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30018Bit or string instructions

Abstract

Es wird ein Verfahren zum Ausführen von Vektoroperationen auf einem Halbleiterchip beschrieben. Das Verfahren umfasst das Ausführen einer ersten Vektoranweisung mit einer Vektor-Funktionseinheit, die auf dem Halbleiterchip implementiert ist, und das Ausführen einer zweiten Vektoranweisung mit der Vektor-Funktionseinheit. Die erste Vektoranweisung ist eine Multiply-Add-Vektoranweisung. Die zweite Vektoranweisung ist eine Vektoranweisung zum Zählen von führenden Nullen.

Description

  • Gebiet der Erfindung
  • Das Gebiet der Erfindung betrifft allgemein Computersysteme und insbesondere eine Prozessorarchitektur zum Ausführen einer Vektor-Multiply-Add-Anweisung und anderer Anweisungen, die Logikblöcke verwenden, die zum Berechnen des Vektor-Multiply-Add-Ergebnisses dienen.
  • Hintergrund der Erfindung
  • Auf dem Gebiet der Informatik sind zwei Arten von Prozessorarchitekturen allgemein bekannt: die skalare und die Vektorprozessorarchitektur. Ein skalarer Prozessor ist so konfiguriert, dass er Anweisungen ausführt, die Operationen an nur einem Datensatz ausführen, während ein Vektorprozessor so konfiguriert ist, dass er Anweisungen ausführt, die Operationen an mehreren Datensätzen ausführen. Die 1A und 1B stellen ein Vergleichsbeispiel dar, das den Hauptunterschied zwischen einem skalaren Prozessor und einem Vektorprozessor zeigt.
  • 1A zeigt ein Beispiel für eine skalare UND-Anweisung, bei der A und B, die eine einzelne Operandengruppe bilden, über ein UND-Gatter zu einem singulären (oder „skalaren”) Ergebnis C (d. h., AB = C) verknüpft werden. Im Gegensatz dazu zeigt 1B ein Beispiel für eine Vektor-UND-Anweisung, bei der A/B und D/E, die zwei Operandengruppen bilden, jeweils über ein UND-Gatter parallel verknüpft werden, um simultan ein Vektor-Ergebnis C, F (d. h., A.AND.B = C und D.AND.E = F) zu erzeugen.
  • Wie auf dem Fachgebiet bekannt ist, werden sowohl die Eingangsoperanden als auch das ausgegebene Ergebnis in dedizierten Registern gespeichert. Viele Anweisungen haben zum Beispiel zwei Eingangsoperanden. Daher werden zwei getrennte Eingaberegister zum Zwischenspeichern der entsprechenden Eingangsoperanden verwendet. Darüber hinaus führen diese Anweisungen zu einem Ausgabewert, der in einem dritten Register (Ergebnisregister) zwischengespeichert wird. In den 1A und 1B sind jeweils Eingaberegister 101a, b und 102a, b und Ergebnisregister 103a, b dargestellt. Man beachte, dass die Charakterisierungen „skalar” im Gegensatz zu „Vektor” problemlos zu erkennen sind.
  • Es ist also zu erkennen, dass die Eingaberegister 101a und 102a mit der skalaren Konfiguration von 1A nur skalare Werte (A bzw. B) halten. Ebenso ist zu erkennen, dass das Ergebnisregister 103a mit der skalaren Konfiguration von 1A nur einen skalaren Wert (C) hält. Im Gegensatz dazu ist zu erkennen, dass die Eingaberegister 101b und 102b des Vektorensystems von 1B Vektoren halten (A, D in dem Register 101b und B, E in dem Register 102b). Ebenso ist zu erkennen, dass das Ergebnisregister 103b des Vektorensystems von 1B einen Vektorenwert (C, F) hält. Was die Terminologie betrifft, so kann der Inhalt der einzelnen Register 101b, 102b und 103b des Vektorensystems von 1B global als ein „Vektor” bezeichnet werden und die einzelnen skalaren Werte in dem Vektor können als ein „Element” bezeichnet werden. Daher ist zum Beispiel zu erkennen, dass das Register 101b den „Vektor” A, D speichert, der aus dem „Element” A und dem „Element” D besteht.
  • Bekanntlich sind bisher nur skalare oder SIMD-Multiplikationsoperationen tatsächlich in einem Halbleiterchip-Prozessor als eine einzelne Prozessor-Anweisung implementiert worden. Zu den skalaren oder SIMD-Multiplikationsanweisungen, die bekanntermaßen in einem Halbleiterchip-Prozessor implementiert worden sind, gehören die Anweisung „Multiply” (MUL), die die niedrigerwertigen Bits des Produkts aus zwei ganzzahligen Eingangsoperanden liefert, und die Anweisung „Multiply High” (MULH), die die höherwertigen Bits einer skalaren Multiplikationsoperation mit ganzen Zahlen liefert.
  • Weitere Anweisungen, die bekanntermaßen in einem Halbleiterprozessorchip als skalare oder SIMD-Anweisungen implementiert worden sind, sind die Anweisung „Court Leading Zeros” („Führende Nullen zählen”; CLZ), die Anweisung „Court Trailing Zeros” („Abschließende Nullen zählen”; CTZ) und die Anweisung „Court” („Zählen”; CNT). Die skalare Anweisung CLZ nimmt eine skalare Eingabe A an und sendet die Anzahl von Nullen in A zurück, die der höchstwertigen Eins in A vorhergehen (z. B. wenn A = 1000 ist, ist das Ergebnis für CLZ = 0; wenn A = 0100 ist, ist das Ergebnis für CLZ = 1; wenn A = 0010 ist, ist das Ergebnis für CLZ = 2, usw.). Die skalare Anweisung CTZ nimmt eine skalare Eingabe A an und sendet die Anzahl von Nullen in A zurück, die auf die niedrigstwerte Eins in A folgen (z. B. wenn A = 1000 ist, ist das Ergebnis für CTZ = 3; wenn A = 0100 ist, ist das Ergebnis für CTZ = 2; wenn A = 0010 ist, ist das Ergebnis für CTZ = 1, usw.). Die skalare Anweisung CNT nimmt eine skalare Eingabe A an und sendet die Anzahl von Einsen in A zurück (z. B. wenn A = 1011 ist, ist das Ergebnis für CLZ = 3; wenn A = 1001 ist, ist das Ergebnis für CLZ = 2; wenn A = 0010 ist, ist das Ergebnis für CLZ = 1, usw.).
  • Kurze Beschreibung der Zeichnungen
  • Die vorliegende Erfindung wird nachstehend beispielhaft und nicht beschränkend in den Figuren der beigefügten Zeichnungen erläutert, in denen ähnliche Bezugssymbole ähnliche Elemente bezeichnen, wobei
  • 1A und 1B skalare und logische Vektoroperationen zeigen;
  • 2 eine Multiply-Add-Funktionseinheit für Vektoren zeigt;
  • 3 eine Ausführungsform einer elektronischen Funktionseinheit zeigt, die für jede der Funktionseinheiten 200_1 bis 200_N von 2 verwendet werden kann;
  • 4A eine Multiply-Add-Operation mit Vektor-Gleitkommas zeigt;
  • 4B eine Gleitkomma-Operation für ganzzahlige Vektoren zeigt;
  • 5 eine Ausführungsform der Funktionseinheit von 3 mit einer erweiterten Logik zum Ausführen von Anweisungen zum Zählen von führenden Nullen, zum Zählen von abschließenden Nullen, zum Zählen von Operanden-Einsen und Paritätsanweisungen zeigt;
  • 6A bis 6D jeweils die Ausführung der folgenden Anweisungen zeigen: Ermitteln von führenden Nullen, Ermitteln von abschließenden Nullen, Zählen von Operanden-Einsen und Ermitteln der Operandenparität;
  • 7 ein Diagramm eines Halbleiterprozessors zeigt und
  • 8 ein Diagramm eines Rechensystems zeigt.
  • Detaillierte Beschreibung
  • Einige Computersysteme können eine Multiply-Add-Operation erfordern. Eine Multiply-Add-Operation führt die Berechnung (A·B) + C aus, wobei A, B und C jeweils ein Eingangsoperand sind. 2 zeigt eine Darstellung einer höheren Architektur einer Vektorenverarbeitungs-Funktionseinheit 200, die eine Vektor-Multiply-Add-Anweisung (VMADD) ausführen kann. Wie in 2 zu erkennen ist, hat die Funktionseinheit N skalare Logikeinheiten 200_1 bis 200_N, die jeweils eine skalare Multiply-Add-Operation an entsprechenden Elementen der Eingabevektoren ausführen. Hier hält ein Eingaberegister 203 einen Eingabevektor A = A_1, A_2, ... A_N, ein Eingaberegister 204 hält einen Eingabevektor B = B_1, B_2, ... B_N, und ein Eingaberegister 205 hält einen Eingabevektor C = C_1, C_2, ... C_N. Die skalare Logikeinheit 200_1 führt die Berechnung ((A_1)·(B_1)) + C_1 aus, die skalare Logikeinheit 200_2 führt die Berechnung ((A_2)·(B_2)) + C_2 aus, und die skalare Logikeinheit 200_N fahrt die Berechnung ((A_N)·(B_N)) + C_N aus. Bei einer Ausführungsform unterstützt jede skalare Logikeinheit sowohl einen Betriebsmodus mit 32-Bit-Operanden als auch einen Betriebsmodus mit 64-Bit-Operanden. Die einzelnen Ergebnisse 202_1 bis 202_N, die von den Logikeinheiten 200_1 bis 200_N berechnet werden, entsprechen den einzelnen Elementen des Ausgabevektors, der von der Vektor-Funktionseinheit 200 bereitgestellt wird und in einem Ausgaberegister gespeichert wird.
  • 2 zeigt auch, dass eine Maskierungsschicht in eine Ausgabeschaltung 206 integriert werden kann, um Vektoroperationen statt SIMD-Operationen zu bewirken. Eine Vektoroperation kann insofern als eine von der SIMD-Operation verschiedene Operation angesehen werden, als die Größe des Eingangsoperanden für Vektormaschinen variabel ist, aber für SIMD-Maschinen feststehend ist. Das Vermögen, die Anzahl von Elementen in der Vektormaschine von 2 zu ändern, wird durch die Maskierung verkörpert, die an dem Ausgang 206 durchgeführt werden kann. Insbesondere kann jedes Ausgabe-Element mit seiner jeweiligen eigenen Schreiblogikschaltung (nicht dargestellt) beschrieben werden. Bei einer Ausführungsform kann die Schreiblogikschaltung an jeden Speicherplatz eines Ausgabe-Elements schreiben. Durch Aktivieren der Schreiblogikschaltung nur für solche Elemente, die einem gültigen Vektoroperanden-Element entsprechen, können Vektoren mit variabler Länge verarbeitet werden. Das hat den Effekt, dass im Wesentlichen nur diejenigen der skalaren Funktionseinheiten 200_1 bis 200_N für den Betrieb freigegeben werden, die einem gültigen Vektorelement entsprechen. Darüber hinaus ermöglicht es die Maske, dass alle arithmetischen Ausnahmen, die für die gültigen Elemente erkannt werden, bereitgestellt werden, während die Ausnahmen für die inaktiven Elemente unterdrückt werden.
  • Wie nachstehend näher dargelegt wird, kann die Funktionseinheit 200 nicht nur eine Vektor-Multiply-Add-Anweisung berechnen, sondern sie kann auch eine Anzahl von weiteren Vektoranweisungen berechnen, wie etwa eine oder mehrere der folgenden Anweisungen: I) eine Vektor-Multiply-Add-High-Anweisung (VMADDH) für ganzzahlige Operanden, die die höherwertigen Bits für die Vektor-Multiply-Add-Berechnung bereitstellt; II) eine Vektor-Multiply-Add-Anweisung (VMADDL) für ganzzahlige Operanden, die die niedrigerwertigen Bits für die Vektor-Multiply-Add-Berechnung bereitstellt; III) eine Vektor-Count-Leading-Zeros-Anweisung (VCLZ), die einen Eingabevektor C annimmt und als ein Ergebnis einen Ausgabevektor bereitstellt, dessen Elemente jeweils der Anzahl von führenden Nullen der Elemente des Eingabevektors C entsprechen; IV) eine Vektor-Count-Trailing-Zeros-Anweisung (VCTZ), die einen Eingabevektor C annimmt und als ein Ergebnis einen Ausgabevektor bereitstellt, dessen Elemente jeweils der Anzahl von abschließenden Nullen der Elemente des Eingabevektors C entsprechen; V) eine Vektor-Count-Anweisung (VCNT), die einen Eingabevektor C annimmt und als ein Ergebnis einen Ausgabevektor bereitstellt, dessen einzelne Elemente jeweils einer Anzahl von Einsen in den einzelnen Elementen des Eingabevektors C entsprechen; und VI) eine Vektorparitätsanweisung (VPAR), die einen Eingabevektor C annimmt und als ein Ergebnis einen Ausgabevektor bereitstellt, dessen einzelne Elemente jeweils dem Paritätsstatus (ungeradzahlig oder geradzahlig) der einzelnen Elemente des Eingabevektors C entsprechen. Wie bei der Anweisung VMADD wird jede der vorstehend aufgezählten Anweisungen durch die skalare Abarbeitung der einzelnen Eingangsoperanden-Elemente der eingegebenen Vektoren A, B und C realisiert. Bei weiteren Ausführungsformen, die ebenfalls später näher beschrieben werden, sind alle Anweisungen, die von der Funktionseinheit 200 ausgeführt werden, an Gleitkomma- und ganzzahligen Operanden funktionsfähig.
  • 3 zeigt eine Ausführungsform einer der skalaren Logikeinheiten von 2. Wie vorstehend dargelegt worden ist, kann die skalare Logikeinheit eine skalare Operation an entsprechenden Elementen der Eingabevektoren A, B und C in Unterstützung der Anweisungen VMADD, VMADDH, VMADDL, VCLZ, VTLZ, VCNT und VPAR ausführen.
  • Nun werden die Operationen für die Anweisung VMADD für den Fall beschrieben, dass die Elemente der Eingabevektoren A, B und C und die Elemente der Ausgabevektors R in Gleitkomma-Form festgelegt sind. Wie auf dem Fachgebiet bekannt ist, nimmt die Darstellung eines numerischen Werts in einem Gleitkomma die Form (Vorzeichen)·(Mantisse)·(Exponent) an, wobei der Wert des Vorzeichens (sgn) angibt, ob der numerische Wert positiv oder negativ ist, der Wert der Mantisse die „Zahl” des Werts angibt und der Wert des Exponenten die Ordnung des Werts angibt. Die Anweisung VMADD kann dann als ((A_sgn)(B_sgn)(A_mantissa)(B_mantissa)(A_exponent + B_exponent)) + (C_sgn)(C_mantissa)(C_exponent) angegeben werden.
  • In 3 berechnet ein Multiplizierer 301 den Term (A_sgn)(B_sgn)(A_mantissa)(B_mantissa) als eine explizite Berechnung zumindest von (A_mantissa)(B_mantissa). Das Vorzeichen des Produkts lässt sich leicht berechnen als I) positiv, wenn A_sgn und B_sgn den gleichen Wert haben, oder II) negativ, wenn A_sgn und B_sgn verschiedene Werte haben. Der Produktexponenten-Block 302 führt eine erste Berechnung des Exponenten für das Endergebnis dadurch aus, dass er den größeren der folgenden Werte verwendet: I) (A_exponent + B_exponent) und II) C_exponent. Das heißt, wenn der Wert C viel größer als das Produkt von A und B ist, steuert die Ordnung des Terms C die Ordnung des Endergebnisses. Ebenso steuert die Ordnung von AB die Ordnung des Endergebnisses, wenn AB viel größer als C ist.
  • Ein Addierer 305 führt die Addition mit der Berechnung AB + C aus. Es ist jedoch zu beachten, dass bevor die Addition in Gleitkomma-Form ausgeführt werden kann, bei einer Ausführungsform der Exponent des Terms AB (das heißt, der Exponent, der mit der Ausgabe des Multiplizierers 301 assoziiert ist) mit dem Exponenten des Terms C gleichgesetzt wird. Um diesen Prozess zu bewirken, werden ein Exponentendifferenz-Block 303 und ein Shifter 304 verwendet. Insbesondere ermittelt der Exponentendifferenz-Block 303 die Differenz zwischen dem Exponenten des Terms AB und dem Exponenten des Terms C [d. h., die Differenz zwischen I) (A_exponent + B_exponent) und II) C_exponent]. Außerdem wird der kleinere der beiden Terme identifiziert (z. B. durch Analysieren der Ausgabe des Produktexponenten-Blocks 302). Die Binärkomma-Position der Mantisse des kleineren der beiden Terme, das heißt die Binärkomma-Position der Mantisse des Terms des Produkts AB oder des Terms C – je nachdem, welcher der Term mit dem kleineren Exponenten ist – wird dann um eine Anzahl von Bitstellen „nach links verschoben”, die der Exponentendifferenz zwischen den beiden Termen entspricht, die von dem Differenzblock 303 ermittelt worden ist. Der verschobene Term und der andere, nicht verschobene Term werden an den Addierer 305 gesendet.
  • Wenn zum Beispiel der Term des Produkts AB 5.5555E8 entspricht und der Term C 2.2222E6 entspricht, wird die Binärkomma-Position der Mantisse des Terms C (2.2222) von dem Shifter 304 um zwei Stellen (0.02222) nach links verschoben, sodass der Addierer 305 die Mantissen der beiden Zahlen, die den gleichen Exponentenwert haben, entsprechend addieren kann. In diesem Beispiel addiert der Addierer 305 entsprechend 5.5555E8 und 0.02222E8. Somit ist bei einer Ausführungsform der Shifter 304 mit dem Ausgang des Differenzblocks 303 verbunden, um die richtige Größe der Verschiebung zu ermitteln, die für die Binärkomma-Position der Mantisse des Terms AB oder des Terms C verwendet werden soll. Bei einer weiteren Ausführungsform wird die Binärkomma-Position der Mantisse einer der Terme AB und C verschoben, während die jeweils andere nicht verschoben wird. Der verschobene Mantissenwert und der nicht verschobene Mantissenwert werden dann für den Addierer 305 bereitgestellt. Natürlich wird keine Verschiebung durchgeführt und die Mantissen des Terms AB und des Terms C werden unverschoben an den Addierer 305 weitergeleitet, wenn der Differenzblock 303 ermittelt, dass die Exponenten des Terms AB und des Terms C gleich groß sind.
  • Bei einer Ausführungsform werden auch die Vorzeichenwerte des Terms AB und des Terms C an den Addierer 305 gesendet, sodass zum Beispiel dann, wenn das Vorzeichen des Terms C negativ ist, die effektive Subtraktion AB-C entsprechend durchgeführt wird. In dem Fall, dass die effektive Subtraktion der beiden Terme (d. h., wenn das Vorzeichen des Terms AB von dem Vorzeichen des Terms C verschieden ist) und der Absolutwert der beiden Terme ungefähr gleich groß sind, kann die Ausgabe des Addierers 305 eine Zahl sein, die nahe Null ist. Daher kann der Mantissenwert an dem Ausgang des Addierers 305 einen String aus führenden Nullen haben, bevor die erste Eins ermittelt wird. Um in diesem Fall ein Ergebnis mit einer höheren Genauigkeit zu erhalten, sollte das Binärkomma des Mantissenwerts an dem Ausgang des Addierers 305 so verschoben werden, dass eine Mantisse entsteht, die eine ganze Zahl als ihren ersten Wert hat.
  • Wenn für den Addierer zum Beispiel ein Mantissen- und Vorzeichen-Term AB von –5.555566... und ein Mantissen- und Vorzeichen-Term C von +5.555555... bereitgestellt werden, erzeugt der Addierer 305 die Ausgabe –0.000011... Um die Genauigkeit des Endergebnisses zu verbessern, sollte das Binärkomma des Ergebnisses von dem Addierer 305 um fünf Stellen nach rechts verschoben werden, sodass es die Form 1.111111... annimmt. Da die Verschiebung des Binärkommas nach rechts einer Änderung des Exponentenwerts entspricht, muss sich auch der Exponentenwert ändern. In diesem speziellen Beispiel entspricht die Verschiebung des Binärkommas der Mantisse um fünf Stellen nach rechts einer Verringerung des Exponentenwerts um 5. Daher muss, wenn der Mantissenterm, der an dem Ausgang des Addierers 305 bereitgestellt wird, führende Nullen hat, nicht nur dessen Binärkomma nach rechts verschoben werden, sondern es muss auch der Exponententerm an dem Ausgang des Produktexponenten-Blocks 303 verringert werden. Um diese Aufgaben zu realisieren, werden hier ein Führende-Einsen-Antizipator-Block 306, ein Normalisierungsshifter 307 und ein Exponenten-Addierer 308 verwendet.
  • Insbesondere flaggt der Führende-Einsen-Antizipator 306 die Stelle der ersten (äußersten linken) Eins in der Ausgabe des Addierers und zeigt dem Normalisierungsshifter 307 an, um wie viele Binärkommas die Ausgabe des Addierers nach rechts verschoben werden sollte, und zeigt dem Exponenten-Addierer 308 an, wie stark der Exponentenwert von dem Exponentenblock 302 verringert werden sollte. Bei einer Ausführungsform wird die Verschiebung des Binärkommas der Ausgabe des Addierers nach rechts durch Verschieben des numerischen Inhalts der Ausgabe des Addierers nach links realisiert. In dieser Ausführungsform oder in weiteren Ausführungsformen erkennt der Addierer 308, dass der Wert, der von dem Führende-Einsen-Antizipator 306 ankommt, von dem Wert subtrahiert werden soll, der von dem Produktexponenten-Block 302 ausgegeben wird.
  • Bei einer Ausführungsform funktioniert der Führende-Einsen-Antizipator wie folgt. Bei den beiden Eingangsoperanden, die für den Addierer 305 bereitgestellt werden (d. h., die Mantisse des Terms AB und die Mantisse des Terms C), ermittelt der Führende-Einsen-Antizipator 306 die Stelle der führenden Eins einzeln in diesen beiden Termen und flaggt die äußerste linke Bitstelle der beiden Stellen der führenden Eins. Wenn zum Beispiel die Mantisse des Terms AB 0001100101... ist und die Mantisse des Terms C 0000100000... ist, flaggt der Führende-Einsen-Antizipator 306 die vierte Bitstelle, da die vierte Bitstelle (des Mantissenterms AB) die äußerste linke führende Eins (oder die höchstwertige führende Eins) unter den beiden Operanden ist. Dann wird diese Stelle als die Stelle der führenden Eins in der Ausgabe des Addierers 305 angenommen. In vielen Fällen ist diese Annahme richtig und wird zum Ermitteln der Größe der Verschiebung der Ausgabe des Addierers, die von dem Normalisierungsshifter 307 durchgeführt wird, und des Umfangs der von dem Addierer 308 durchgeführten Verkleinerung des Exponenten verwendet.
  • In einigen Fällen ist jedoch die Annahme nicht korrekt. Die beiden Operanden, die in dem soeben angeführten Beispiel bereitgestellt werden, werden von dem Addierer addiert, sodass eine Addierer-Ausgabe 0010000101... entsteht. In Fällen, in denen die Annahme wie in dem vorliegenden Beispiel nicht richtig ist, bewirkt die Addition der beiden Operanden einen Übertragsterm an der Bitstelle, die von dem Führende-Einsen-Antizipator identifiziert worden ist (d. h., die Bitstelle in der Ausgabe des Addierers, die von dem Führende-Einsen-Antizipator identifiziert worden ist, ist eine Null), und somit ist die Bitstelle eine Stelle links von der Stelle, die von dem Führende-Einsen-Antizipator identifiziert worden ist, eine Eins. Somit führt bei einer Ausführungsform eine Logikschaltung einen oder beide der folgenden Schritte als eine „Kontrolle” aus, bevor der angenommene Wert freigegeben wird, der von dem Führende-Einsen-Indikator 306 als der Betrag geflaggt worden ist, um den die Ausgabe des Addierers verschoben werden sollte und um den ihr Exponent verkleinert werden sollte: I) Ermitteln, ob die Stelle der Ausgabe des Addierers 305, die von dem Führende-Einsen-Indikator identifiziert worden ist, eine Null ist, und II) Ermitteln, ob die Stelle der Ausgabe des Addierers 305 unmittelbar links von der Stelle, die von dem Führende-Einsen-Indikator identifiziert worden ist, eine Eins ist. Wenn jede dieser Bedingungen zutreffend ist, dann ist die richtige Antwort nicht die Bitstelle, die. von dem Führende-Einsen-Indikator 306 geflaggt worden ist, sondern die Bitstelle unmittelbar links von der Bitstelle, die von dem Führende-Einsen-Indikator geflaggt worden ist.
  • In diesem Fall wird der Führende-Einsen-Indikator seine Annahme dem Wesen nach korrigieren und korrekte Informationen für den Shifter 307 und den Addierer 308 bereitstellen.
  • Hierbei ist zu beachten, dass ein Grund dafür, weshalb ein Führende-Einsen-Antizipator verwendet wird, darin besteht, dass der Prozess des Ermittelns einer Stelle der führenden Eins etwas komplex ist und einen oder mehrere Taktzyklen in Anspruch nehmen kann. Ebenso ist die Addition, die von dem Addierer 305 durchgeführt wird, etwas komplex und kann einen oder mehrere Taktzyklen in Anspruch nehmen. Wenn die Ermittlung der führenden Einsen „im Anschluss an” den Addierer 305 konfiguriert wurde, werden zwei oder mehr Taktzyklen in Anspruch genommen, um die Summe von AB + C und die Stelle der führenden Eins in der Summe zu ermitteln. Bei der Architektur, die in 3 dargestellt ist, laufen jedoch die Summierung durch den Addierer 305 und die Ermittlung der führenden Einsen durch den Antizipator 306 weitgehend parallel ab, wodurch die Gesamtdauer der in Anspruch genommenen Taktzyklen im Vergleich zu der seriellen Methode verkürzt wird. Und selbst wenn das Ergebnis des Führende-Einsen-Antizipators 306 möglicherweise falsch ist und daher überprüft wird, ist die vorstehend beschriebene „Kontroll”-Operation relativ einfach und die Logik, die zum Ausführen dieser Operation verwendet wird, ist von Anfang bis Ende relativ kurz, sodass die Zeitstrafe der Kontroll-Operation akzeptabel ist und sie daher die bessere Gesamtlösung darstellt.
  • Wenn der Shifter 307 das Ergebnis des Addierers 305 verschoben hat und der Addierer 308 den Exponentenwert verkleinert hat (wenn eine solche Verschiebung und Verkleinerung des Exponenten anwendbar sind), ist die „Antwort” auf die Anweisung FMADD (AB + C) im Wesentlichen bestimmt worden. Zum Darstellen der Antwort mit der gewünschten Genauigkeit und einem entsprechenden Format wird eine Endverarbeitung durchgeführt. Teil dieser Verarbeitung ist das Runden des Mantissenwerts. Bei einer Ausführungsform kann die Anweisung eines von zwei verschiedenen Genauigkeitsniveaus festlegen: einfache Genauigkeit oder doppelte Genauigkeit. Bei einer weiteren Ausführungsform wird der Wert mit der doppelten Genauigkeit mit der doppelten (oder ungefähr der doppelten) Anzahl von Bits dargestellt, mit der der Wert mit der einfachen Genauigkeit dargestellt wird. Bei einer weiteren Ausführungsform besteht das Format mit der einfachen Genauigkeit aus 32 Bit, die sich aus 1 Bit für das Vorzeichen, 23 Bit für die Mantisse und 8 Bit für den Exponenten zusammensetzen, und das Format mit der doppelten Genauigkeit besteht aus 64 Bit, die sich aus 1 Bit für das Vorzeichen, 52 Bit für die Mantisse und 11 Bit für den Exponenten zusammensetzen. Bei einer weiteren Ausführungsform wird intern in einer Funktionseinheit 300 die Mantisse mit bis zu 128 Bit für die Genauigkeit berechnet. Hier ist die Ausgabebreite des Multiplizierers 301 mit 128 Bit konfiguriert, um die Ganzzahlen-Multiplikation von zwei ganzzahligen 64-Bit-Werten auszuführen. Auch die Ausgabe des Addierers 305 und die Ausgabe des Shifters 307 umfassen jeweils 128 Bit.
  • In dieser Weise kann bei verschiedenen Ausführungsformen die Anzahl von Bits, die intern von der Funktionseinheit 300 für die Mantisse in dem Ergebnis berechnet werden, die Anzahl von Bits überschreiten, die tatsächlich als die Mantisse in dem Endergebnis bereitgestellt werden. Daher ermittelt die Rundungsoperation, ob eines der Bits unterhalb der zum Schluss bereitgestellten Mantisse eine Eins ist, und dies wird als ein Sticky Bit bezeichnet. In der Architektur von 3 ermittelt ein Abschließende-Nullen-Logikblock 309 die Anzahl von abschließenden Nullen in der Ausgabe des Shifters 307. Diese Anzahl gibt im Vergleich zu der Anzahl von zusätzlichen Bits bei der Berechnung durch die Funktionseinheit 300 an, ob es eine Eins in den Bits unterhalb der zum Schluss bereitgestellten Mantisse gibt. Wenn die Mantisse nach links verschoben wird, um die führenden Nullen zu eliminieren, während Nullen nach unten verschoben werden, muss die Anzahl von zusätzlichen abschließenden Nullen berücksichtigt werden, die gleich dem Betrag der Verschiebung nach links ist, der von dem Führende-Einsen-Antizipator-Block 306 berechnet worden ist. Um hier die Anzahl von abschließenden Nullen in der Ausgabe des Shifters 307 richtig zu berechnen, sollte der Abschließende-Nullen-Detektor 309 eine Verschiebung erkennen, die von dem Führende-Einsen-Antizipator 306 bewirkt wird, und daher ist der Abschließende-Nullen-Detektor 309 außerdem so konfiguriert, dass er eine Eingabe von dem Führende-Einsen-Antizipator 306 annimmt.
  • Die Anzahl von Nullen wird von der niedrigstwerten (äußersten rechten) Bitstelle bitweise nach links zu der jeweils nächsthöheren Bitstelle bis zu der Stelle der niedrigstwerten (äußersten rechten) Eins ermittelt. Wenn die Anzahl von abschließenden Nullen für eine gegebene Genauigkeit bis zu der niedrigstwerten (äußersten rechten) Bitstelle der Mantisse oder darüber hinaus (nach links) reicht, wird die niedrigstwerte Bitstelle auf ihrem aktuellen Wert gehalten (d. h., es erfolgt keine Aufrundung). Andernfalls erfolgt eine Aufrundung und die niedrigstwerte Bitstelle der Mantisse für die anwendbare Genauigkeit wird I) von 0 auf 1 oder II) von 1 auf 0 inkrementiert, und es entsteht ein Übertragsterm, der sich wellenartig zu der nächsthöheren Bitstelle bewegt.
  • Zum Addieren des Werts Eins zu der niedrigstwerten Bitstelle der resultierenden Mantisse in dem Shifter 307 für die anwendbare Genauigkeit wird ein Aufrundungsaddierer 310 verwendet. Die Ausgabe des Addierers 310 wird als der Endwert der Mantisse für die gewünschte Genauigkeit verwendet. Bei einer Ausführungsform wird die Ausgabe des Addierers 310 stets als der Endwert der Mantisse für die gewünschte Genauigkeit verwendet, wobei der Wert 0 effektiv zu der Ausgabe des Shifters 307 addiert wird, wenn keine Aufrundung erfolgt, und der Wert 1 zu der Ausgabe des Shifters 307 an der äußersten rechten Stelle für die gegebene Genauigkeit addiert wird, wenn eine Aufrundung erfolgt. Wie in 3 zu erkennen ist, ermittelt eine Sticky-Bit-Berechnungslogik 311 auf Grund der Ausgabe der Abschließende-Nullen-Detektionslogik 309 und der gewünschten Genauigkeit, ob eine Aufrundung erforderlich ist oder nicht, und eine Aufrundungssteuerlogik 312 stellt eine Null oder eine Eins für den Addierer 310 an der niedrigstwerten Bitstelle für die gewünschte Genauigkeit in Abhängigkeit von der Ermittlung des Sticky Bits bereit (eine Null wird eingefügt, wenn keine Aufrundung durchgeführt wird, und eine Eins wird eingefügt, wenn eine Aufrundung durchgeführt wird).
  • Man beachte, dass bei der Ausführungsform von 3 die Abschließende-Nullen-Detektionslogik 309 an den Operanden arbeitet, die für den Addierer 305 bereitgestellt werden, sodass sie wie der Führende-Einsen-Antizipator 306 parallel zu dem Addierer 305 arbeiten kann. Bei einer weiteren Ausführungsform identifiziert der Abschließende-Nullen-Detektor den niedrigstwerten (äußersten rechten) Bitwert 1 in jedem Operanden und flaggt die niedrigstwerte Bitstelle bei den beiden Operanden als die Grundlage zum Ermitteln der Anzahl von abschließenden Nullen in der Ausgabe des Addierers 305. Eine Verschiebung, die von dem Führende-Einsen-Antizipator induziert wird, wird auch von dem Abschließende-Nullen-Detektor 309 berücksichtigt. Das heißt, für eine gegebene Genauigkeit beeinflusst eine Verschiebung des Ergebnisses des Addierers 305 die Anzahl der Nullen, die detektiert werden müssen, bevor ermittelt wird, ob sie bis zu dem niedrigstwerten Bit der Ausgabe des Shifters 307 oder darüber hinaus reichen. Man beachte, dass diese Methode für die Detektion von abschließenden Nullen keine „Kontrolle” (wie bei dem Führende-Einsen-Antizipator) erfordert, da keine Möglichkeit (mathematisch gesprochen) eines Fehlers besteht.
  • Die vorstehende Beschreibung erfolgte für die Gleitkomma-Berechnung bei der Anweisung VMADD. Bei einer Anweisung VMADD für ganzzahlige Vektoren werden ganzzahlige Operanden einfach für den Eingang des Multiplizierers 301 bereitgestellt. Hier ist bei einer Ausführungsform, die 53-Bit-Gleitkomma-Mantissen-Berechnungen mit doppelter Genauigkeit unterstützt, der Multiplizierer so konfiguriert, dass er eine Multiplikation mit ganzen Zahlen von 64 Bit durchführt. Somit hat die Ausgabe des Multiplizierers eine Breite von 128 Bit. Bei der Operation mit ganzen Zahlen von 64 Bit wird bei einer Ausführungsform der Term C links mit 64 Nullen aufgefüllt, sodass sein niedrigstwertes Bit mit dem niedrigstwerten Bit der Ausgabe des Multiplizierers 301 abgeglichen wird. Das heißt, der Operand des Terms C, der für den Addierer 305 bereitgestellt wird, hat 64 Bit mit Nullen als seine linke Hälfte und den 64-Bit-C-Eingangsoperanden als seine rechte Hälfte. Da die Ausführungsform die Berechnung von (1) einer Operation mit der doppelten Genauigkeit oder einer Operation mit 64-Bit-Ganzzahlen und (2) einer Operation mit einfacher Genauigkeit oder zwei Operationen mit 32-Bit-Ganzzahlen unterstützt, wird für die 32-Bit-Ganzzahlen die obere Hälfte jedes der beiden Terme C (jeweils 32 Bit) mit Nullen aufgefüllt, sodass sie eine Breite von 64 Bit erhalten. Bei einer Operation mit 32-Bit-Ganzzahlen wird der Term C entsprechend aufgefüllt. Bei einer Ausführungsform wird das Auffüllen mit Nullen effektiv durch Verschieben des Terms C nach rechts mit dem Shifter 304 realisiert. Bei einer weiteren Ausführungsform wird für eine Ganzzahlen-Operation der Exponentendifferenz-Block 303 verwendet, um den Betrag der Verschiebung in Abhängigkeit von der Genauigkeit für die Ganzzahlen-Berechnung festzulegen. Das heißt, zum Beispiel für eine Operation mit Ganzzahlen von 64 Bit ist der Exponentendifferenz-Block 303 so konfiguriert, dass er ein Eingangssignal an den Shifter 304 sendet, das den Shifter 304 veranlasst, den Term C um 64 Bit nach rechts zu verschieben, und für eine Operation mit Ganzzahlen von 32 Bit ist der Exponentendifferenz-Block 303 so konfiguriert, dass er ein Eingangssignal an den Shifter 304 sendet, das den Shifter 304 veranlasst, den Term C um 96 Bit nach rechts zu verschieben.
  • Der Addierer 305 addiert die Ausgabe des Multiplizierers und den verschobenen, abgeglichenen Wert des Terms C, um den ganzzahligen Wert von AB + C zu ermitteln. Da die Größe des ganzzahligen Werts von AB + C größer als die zulässige Bitbreite des Endergebnisses werden kann, wird bei einer Ausführungsform die obere Hälfte oder die untere Hälfte der Ausgabe des Addierers 305 als das Endergebnis durch den Shifter 307 gesendet. Zum Beispiel kann bei einer Ausführungsform, bei der die Ausgabe des Addierers 305 eine Breite von 128 Bit hat und eine Operation mit Ganzzahlen von 64 Bit verwendet wird, das Ergebnis der Anweisung nur eine Breite von 64 Bit haben, und dennoch berechnet die interne Funktionseinheit ganzzahlige Werte von 128 Bit. An und für sich gibt es zwei verschiedene VMADD-Anweisungen für Operationen mit ganzen Zahlen: VMADDH und VMADDL. VMADDH verkörpert die höchstwertigen 64 Bit der Ausgabe des Addierers von 128 Bit, und VMADDL verkörpert die niedrigstwerten 64 Bit der Ausgabe des Addierers von 128 Bit. Bei einer VMADD-Operation mit ganzen Zahlen werden der Produktexponenten-Block 302, der Führende-Einsen-Antizipator 307, der Exponenten-Addierer 308, der Abschließende-Nullen-Detektor 309, die Sticky-Bit-Logik 311 und die Aufrundungssteuerlogik 312 nicht verwendet, außer vielleicht zum Einfügen einer irrelevanten Null in dem Addierer 310.
  • 4A zeigt eine Ausführungsform einer Gleitkomma-VMADD-Operation der vorstehend beschriebenen Funktionseinheit, und 4B zeigt eine Ausführungsform einer VMADDL/H-Operation mit ganzen Zahlen in der vorstehend beschriebenen Funktionseinheit. In 4A werden die entsprechenden Mantissenwerte für die Operanden A und B im Schritt 401 multipliziert. Im Wesentlichen parallel wird im Schritt 402 die Differenz zwischen dem Exponentenwert des Terms AB und dem des Terms C ermittelt, und im Schritt 403 wird der Höchstwert des Exponenten des Terms AB und des Exponenten des Terms C als der Anfangsexponent für das Ergebnis verwendet. Im Schritt 404 wird auf Grund der ermittelten Differenz zwischen den Exponenten der Terme AB und C die Mantisse des Terms, der den kleineren Exponenten hat, verschoben, um sie mit der Mantisse des Terms abzugleichen, der den größeren Exponenten hat. Die abgeglichenen Mantissen der Terme AB und C werden dann im Schritt 405 addiert. Im Wesentlichen parallel werden die führenden Einsen des Ergebnisses des Addierers im Schritt 406 vorausberechnet. Im Schritt 407 wird die Vorausberechnung der führenden Einsen mit dem Ergebnis der Summierung von AB + C verglichen. Auf Grund der Ermittlung der führenden Einsen wird im Schritt 408 das Ergebnis der Mantissen-Summierung von AB + C so verschoben, dass es mit einem ganzzahligen Wert führt, und im Schritt 409 wird das Exponenten-Ergebnis für die Anweisung eingestellt. Gegebenenfalls wird eine Aufrundung durchgeführt (Schritt 410), und auf Grund der festgelegten Genauigkeit wird der Mantissenwert bereitgestellt.
  • In 4B werden im Schritt 411 die ganzzahligen Terme A und B miteinander multipliziert, und im Schritt 412 wird der Term C aufgefüllt, um ihn mit dem Produkt AB abzugleichen. Im Schritt 413 werden die ganzzahligen Terme AB und C addiert. Wenn die Anweisung den oberen Teil festlegt, wird der obere Teil von AB + C bereitgestellt, oder wenn die Anweisung der unteren Teil festlegt, wird der untere Teil von AB + C bereitgestellt (Schritt 414). Man beachte, dass dadurch, dass VMADDH nacheinander mit VMADDL ausgeführt wird und die Ergebnisse an getrennten Stellen gespeichert werden, das System den Gesamtwert für AB + C halten kann.
  • Es sei hier wiederholt, dass bei der vorstehenden Beschreibung der Funktionseinheit 300 eine Funktionseinheit beschrieben wird, die mehrfach in einer Vektor-Funktionseinheit instanziiert werden kann, sodass Vektor-Multiply-Add-Anweisungen (VMADD) ausgeführt werden.
  • Die Funktionseinheit 300 von 3 kann auch so verbessert werden, dass sie eine skalare Komponente einer oder mehrerer der folgenden Anweisungen ausführt: I) eine Vektor-Count-Leading-Zeros-Anweisung (VCLZ), die einen Eingabevektor C annimmt und als ein Ergebnis einen Ausgabevektor bereitstellt, dessen Elemente jeweils der Anzahl von führenden Nullen der Elemente des Eingabevektors C entsprechen; II) eine Vektor-Count-Trailing-Zeros-Anweisung (VCTZ), die einen Eingabevektor C annimmt und als ein Ergebnis einen Ausgabevektor bereitstellt, dessen Elemente jeweils der Anzahl von abschließenden Nullen der Elemente des Eingabevektors C entsprechen; III) eine Vektor-Count-Anweisung (VCNT), die einen Eingabevektor C annimmt und als ein Ergebnis einen Ausgabevektor bereitstellt, dessen einzelne Elemente jeweils einer Anzahl von Einsen in den einzelnen Elementen des Eingabevektors C entsprechen; und IV) eine Vektorparitätsanweisung (VPAR), die einen Eingabevektor C annimmt und als ein Ergebnis einen Ausgabevektor bereitstellt, dessen einzelne Elemente jeweils dem Paritätsstatus (ungeradzahlig oder geradzahlig) der einzelnen Elemente des Eingabevektors C entsprechen.
  • 5 zeigt eine verbesserte Funktionseinheit 500, die eine zusätzliche Logik und eine zusätzliche Schaltung enthält, die über die Logik und die Schaltung hinausgehen, die in 3 dargestellt sind, um eine skalare Komponente der Anweisungen VCLZ, VCTZ, VCNT und VPAR auszuführen. Bei einer Ausführungsform wird entsprechend diesen Anweisungen das Element des Vektors, das von der Funktionseinheit 500 von 5 verarbeitet wird, entlang dem Datenpfad empfangen, auf dem auch der Operand C der Anweisung AB + C empfangen wird. Es ist zu betonen, dass dies nur eine Methode ist und dass, je nach Wahl des Entwicklers, der Operand für jede der Anweisungen VCLZ, VCTZ, VCNT und VPAR auch entlang dem Datenpfad eines der Operanden A, B und C der Anweisung AB + C empfangen werden kann. Der Einfachheit halber sind die Verbindungen zwischen den verschiedenen Logikblöcken zum Ausführen der Anweisung VMADD nicht dargestellt. Es dürfte aber klar sein, dass diese Verbindungen vorhanden sind (wie z. B. in 3 zu erkennen ist). Natürlich kann jeder der Blöcke, die in den beiden 3 und 5 dargestellt sind, auch mit einer Halbleiter-Logikschaltung implementiert werden.
  • Da bei der speziellen Ausführungsform von 5 der Operand für jede der Anweisungen VCLZ, VCTZ, VCNT und VPAR entlang dem Datenpfad für den Operanden C empfangen wird, wird der Operand von einem Abgleichs-Shifter 504 empfangen (man beachte, dass jeder der „Shifter” auch als ein Schieberegister implementiert werden kann). Wenn im Gegensatz zu der Anweisung VMADD eine der Anweisungen VCLZ, VCTZ, VCNT und VPAR festgelegt wird, ignoriert der Abgleichs-Shifter eine Eingabe von der Exponentendifferenz-Einheit 503 und stellt einfach den Operanden C zumindest für die anwendbare Logik für die entsprechende Anweisung bereit, das heißt, für eine Logik 506 für die Anweisung VCLZ, eine Logik 509 für die Anweisung VCTZ und eine Logik 530 für die Anweisung VCNT. Außerdem stellt der Abgleichs-Shifter 504 einen positiven Wert von Null auf dem Datenpfad bereit, der die Mantisse des Terms AB für die Anweisung VMADD überträgt.
  • Bei der Anweisung VCLZ, die die Anzahl von führenden Nullen für den bereitgestellten Operanden bereitstellt, ist zu beachten, dass im Gegensatz zu 3 die Logik 506 als eine Führende-Einsen- und Führende-Nullen-Antizipator-Logikschaltung implementiert ist (im Gegensatz zu der Führende-Einsen-Antizipator-Logikschaltung 306 von 3). Man beachte, dass hier die Anzahl von führenden Nullen in einem Operanden in Beziehung zu der Stelle der führenden Eins in einem Operanden steht. Insbesondere ist bei einem Operanden mit einer bekannten Bitbreite die Anzahl von führenden Nullen gleich der Differenz zwischen der Bitbreite des Operanden und der Bitstelle der führenden Eins in dem Operanden. Erinnern wir uns daran, dass bei einer Ausführungsform der Führende-Einsen-Antizipator 306 die Stelle der führenden Eins in beiden Mantissentermen AB und C für die Anweisung VMADD ermittelt und die Stelle der höchstwertigen (äußersten linken) führenden Eins in diesen beiden Termen flaggt. Da hier der Abgleichs-Shifter 504 so konfiguriert ist, dass er einen Wert 0 für den Term AB für die Anweisung VCLZ bereitstellt, wird nur die Stelle der führenden Eins des Terms C (der Operand für die Anweisung VCLZ) geflaggt. Daraus kann die Anzahl von führenden Nullen für den Operanden ermittelt werden. Man beachte, dass unterschiedliche Operanden-Bitlängen (z. B. 32 Bit oder 64 Bit) problemlos verarbeitet werden können, wenn die anwendbare Bitlänge festgelegt ist oder anderweitig bekannt ist.
  • Erinnern wir uns daran, dass der Führende-Einsen-Antizipator 306 von 3 als ein „Antizipator” angesehen wurde, da unter bestimmten Umständen seine erste Antwort unrichtig sein könnte. Insbesondere musste die Ausgabe des Addierers 305 überprüft werden. Bei der Anweisung VCLZ entsteht dieses Problem jedoch nicht, da der Addierer 305 nicht zum Einsatz kommt. Somit ist die „Antwort” von der Logik 506 richtig und braucht nicht überprüft zu werden. Die Anzahl von führenden Nullen wird dann schließlich an eine Formatierungslogik 513 gesendet, um die Antwort in einem entsprechenden Format für die Anweisung bereitzustellen. Bei einer Ausführungsform wird die Anzahl von führenden Nullen (wie die Anzahl von führenden Einsen für die Anweisung VMADD) an einen Exponenteneinstellungsaddierer 508 gesendet, der sie an die Formatierungslogik 513 weiterleitet.
  • Bei der Anweisung VCTZ, die die Anzahl von abschließenden Nullen für den Eingangsoperanden bereitstellt, wird der Operand C an die Abschließende-Nullen-Ermittlungslogik 509 gesendet. Erinnern wir uns ausgehend von der Erörterung von 3 daran, dass die Abschließende-Nullen-Ermittlungslogik 309 den niedrigstwerten (äußersten rechten) Bitwert 1 in jedem Operanden (AB und C) identifiziert und die niedrigstwerte Bitstelle von den zwei Operanden als die Grundlage zum Ermitteln der Anzahl von abschließenden Nullen in der Ausgabe des Addierers 305 flaggt. Diese Operation gilt auch für die Operation für die Anweisung VCTZ, wobei noch anzumerken ist, dass der Term AB auf Null gesetzt wird, sodass nur der Term C (der Operand für die Anweisung VCTZ) die endgültige Antwort steuert, die von der Logik 509 bereitgestellt wird. Die Antwort wird schließlich an die Formatierungslogik 513 gesendet, die die Antwort für die Anweisung bereitstellt (die Antwort kann vorher von einem anderen Block verarbeitet werden, wie etwa dem Exponenteneinstellungsaddierer 508).
  • Bei der Anweisung VCNT zählt eine Einsenzähllogik 520 die Anzahl von Einsen, die in dem Operanden C vorhanden sind, und die Antwort wird schließlich an die Formatierungslogik 513 gesendet. Bei der Anweisung VPAR ermittelt die Paritätslogik 530 den Paritätswert für den Operanden C (z. B. ob es eine ungeradzahlige oder geradzahlige Anzahl von Einsen in dem Operanden gibt), und die Antwort wird schließlich an die Formatierungslogik 513 gesendet, die die Antwort für die Anweisung bereitstellt.
  • Die 6A bis 6D zeigen die Funktionsweise der Funktionseinheit 200 von 2 für den Fall, dass die Operationen, die vorstehend für die Funktionseinheit 500 von 5 beschrieben worden sind, N-mal parallel ausgeführt werden, um eine Vektoroperation zu bewirken. Für die Anweisung VCLZ wird in 6A im Schritt 601a ein Eingabevektor von Operanden/Elementen angenommen, im Schritt 602a wird die Anzahl von führenden Nullen in jedem der Operanden ermittelt, und im Schritt 603a wird ein Ausgabevektor mit der Anzahl von führenden Nullen für jeden der Operanden bereitgestellt. Für die Anweisung VCTZ wird in 6B im Schritt 601b ein Eingabevektor von Operanden/Elementen angenommen, im Schritt 602b wird die Anzahl von abschließenden Nullen in jedem der Operanden ermittelt, und im Schritt 603b wird ein Ausgabevektor mit der Anzahl von abschließenden Nullen für jeden der Operanden bereitgestellt. Für die Anweisung VCNT wird in 6C im Schritt 601c ein Eingabevektor von Operanden/Elementen angenommen, im Schritt 602c wird die Anzahl von Einsen in jedem der Operanden ermittelt, und im Schritt 603c wird ein Ausgabevektor mit der Anzahl von Einsen für jeden der Operanden bereitgestellt. Für die Anweisung VPAR wird in 6D im Schritt 601d ein Eingabevektor von Operanden/Elementen angenommen, im Schritt 602d wird die Parität jedes der Operanden ermittelt, und im Schritt 603d wird ein Ausgabevektor mit der Parität für jeden der Operanden bereitgestellt.
  • Wie vorstehend dargelegt worden ist, können die vorstehend beschriebenen Funktionseinheiten in Anweisungsausführungseinheiten eines Halbleiterprozessors implementiert werden.
  • 7 zeigt einen generischen Verarbeitungskern 700, der mutmaßlich viele verschiedene Arten von Verarbeitungskern-Architekturen verkörpert, wie etwa Complex Instruction Set (CISC), Reduced Instruction Set (RISC) and Very Long Instruction Word (VLIW). Der generische Verarbeitungskern 700 von 7 weist Folgendes auf: 1) eine Abrufeinheit 703, die Anweisungen abruft (z. B. aus dem Cache und/oder dem Speicher); 2) eine Decodiereinheit 704, die Anweisungen decodiert; 3) eine Scheduling-Einheit 705, die den Zeitpunkt und/oder die Reihenfolge der Ausgabe von Anweisungen an Ausführungseinheiten 706 festlegt (man beachte, dass der Scheduler optional ist); 4) Ausführungseinheiten 706, die die Anweisungen ausführen [typische Anweisungsausführungseinheiten sind Sprungausführungseinheiten, arithmetische Ganzzahlen-Ausführungseinheiten (z. B. ALUs), arithmetische Gleitkomma-Ausführungseinheiten (z. B. FPUs) und Speicherzugriffs-Ausführungseinheiten]; und 5) eine Retirement-Einheit 707, die einen erfolgreichen Abschluss einer Anweisung signalisiert. Es ist zu beachten, dass der Verarbeitungskern 700 einen Mikrocode 708 verwenden kann oder auch nicht.
  • Die vorstehend beschriebenen Funktionseinheiten haben zwar durchgehend festverdrahtete Datenpfade, aber es ist alles in allem möglich, die gesamte vorstehend beschriebene Verarbeitung oder einen Teil davon mit einem Mikrocode statt mit einer dedizierten Logik zu implementieren. Bei Prozessoren mit einem Mikrocode werden die Mikrooperationen normalerweise in einem nichtflüchtigen maschinenlesbaren Medium [wie etwa einem Festspeicher (ROM)] in dem Halbleiterchip gespeichert, auf dem der Prozessor integriert ist und der die Ausführungseinheiten in dem Prozessor veranlasst, die gewünschte Funktion auszuführen, die von der Anweisung aufgerufen wird.
  • Ein Prozessor, der die vorstehend beschriebene Funktionalität hat, kann auch in verschiedenen Rechensystemen implementiert werden. 8 zeigt eine Ausführungsform eines Rechensystems (z. B. eines Computers). Das beispielhafte Rechensystem von 8 weist Folgendes auf: 1) einen oder mehrere Prozessoren 801, die so konfiguriert sein können, dass sie eine logische Vektorverkleinerungsanweisung enthalten; 2) einen Memory Controller Hub (MCH) 802; 3) einen Systemspeicher 803 (von dem es verschiedene Arten gibt, wie etwa DDR RAM, EDO RAM usw.); 4) einen Cache 804; 5) einen E/A Control Hub (ICH) 805; 6) einen Grafikprozessor 806; 7) eine Anzeige/einen Bildschirm 807 [von dem es verschiedene Arten gibt, wie etwa Elektronenstrahlröhre (CRT), Flachbildschirm, Dünnschichttransistor (TFT), Flüssigkristallanzeige (LCD), DPL usw.]; und ein oder mehrere E/A-Geräte 808.
  • Der eine oder die mehreren Prozessoren 801 (ihren Anweisungen aus, um ihre Funktion zu erfüllen, welche Software-Routinen das Rechensystem auch immer implementiert. Die Anweisungen umfassen oftmals eine Art Operation, die an Daten ausgeführt wird. Sowohl Daten als auch Anweisungen werden in dem Systemspeicher 803 und dem Cache 804 gespeichert. Der Cache 804 ist normalerweise so konfiguriert, dass er kürzere Latenzzeiten als der Systemspeicher 803 hat. Zum Beispiel könnte der Cache 804 auf dem/den gleichen Chip(s) wie der oder die Prozessor(en) integriert werden und/oder mit schnelleren SRAM-Zellen konfiguriert werden, während der Systemspeicher 803 mit langsameren DRAM-Zellen konfiguriert werden könnte. Dadurch, dass dazu tendiert wird, häufiger verwendete Anweisungen und Daten in dem Cache 804 statt in dem Systemspeicher 803 zu speichern, verbessert sich die gesamte Leistungsfähigkeit des Rechensystems.
  • Der Systemspeicher 803 wird zielgerichtet für andere Komponenten in dem Rechensystem verfügbar gemacht. Zum Beispiel werden die Daten, die von verschiedenen Schnittstellen mit dem Rechensystem (z. B. Tastatur und Maus, Druckeranschluss, LAN-Anschluss, Modemanschluss usw.) empfangen werden oder aus einem internen Speicherelement des Rechensystems (z. B. Festplattenlaufwerk) abgerufen werden, oft vorübergehend in eine Warteschlange für den Systemspeicher 803 eingereiht, bevor sie von dem einen oder den mehreren Prozessoren 801 bei der Implementierung des Software-Programms verarbeitet werden. Ebenso werden Daten, für die ein Software-Programm festlegt, dass sie von dem Rechensystem über eine der Schnittstellen des Rechensystems an eine externe Entität zu senden sind oder in einem internen Speicherelement zu speichern sind, oft vorübergehend in eine Warteschlange für den Systemspeicher 803 eingereiht, bevor sie übertragen oder gespeichert werden.
  • Der ICH 805 ist dafür verantwortlich, zu gewährleisten, dass diese Daten zwischen dem Systemspeicher 803 und seiner entsprechenden Schnittstelle zu dem Rechensystem (und einer internen Speichervorrichtung, wenn das Rechensystem in dieser Weise konfiguriert ist) korrekt übertragen werden. Der MCH 802 ist dafür verantwortlich, die verschiedenen konkurrierenden Anforderungen, die dicht nacheinander entstehen können, für den Zugriff auf den Systemspeicher 803 von dem einen oder mehreren Prozessoren 801, den Schnittstellen und den internen Speicherelementen zu verwalten.
  • In einem typischen Rechensystem sind auch ein oder mehrere E/A-Geräte 808 implementiert. E/A-Geräte sind im Allgemeinen dafür verantwortlich, Daten zu und/oder von dem Rechensystem (z. B. einem Netzwerkadapter) zu übertragen oder Daten nichtflüchtig in großen Mengen in dem Rechensystem (z. B. in einem Festplattenlaufwerk) zu speichern. Der ICH 805 hat bidirektionale Punkt-zu-Punkt-Verbindungen zwischen sich selbst und den dargestellten E/A-Geräten 808.
  • In der vorstehenden Beschreibung ist die Erfindung unter Bezugnahme auf spezielle beispielhafte Ausfürungsformen der Erfindung beschrieben worden. Es dürfte jedoch klar sein, dass verschiedene Modifikationen und Änderungen daran vorgenommen werden können, ohne von dem Grundgedanken und dem Schutzumfang der Erfindung abzuweichen, die in den beigefügten Ansprüchen dargelegt sind. Die Patentbeschreibung und die Zeichnungen sind daher als erläuternd und nicht als beschränkend anzusehen.

Claims (18)

  1. Vektor-Funktionseinheit, die auf einem Halbleiter implementiert ist, zum Ausführen von Vektoroperationen der Dimension N, mit: N Funktionseinheiten, wobei jede der N Funktionseinheiten eine Logikschaltung aufweist, um Folgendes auszuführen: eine Multiply-Add-Anweisung an entsprechenden Operanden A, B und C und eine Führende-Nullen-Anweisung an einem entsprechenden ersten Operanden.
  2. Vektor-Funktionseinheit nach Anspruch 1, dadurch gekennzeichnet, dass jede der N Funktionseinheiten weiterhin eine Logikschaltung zum Ausführen einer Abschließende-Nullen-Anweisung an einem entsprechenden zweiten Operanden aufweist.
  3. Vektor-Funktionseinheit nach Anspruch 2, dadurch gekennzeichnet, dass jede der N Funktionseinheiten weiterhin eine Logikschaltung zum Ausführen einer Paritätsanweisung an einem entsprechenden dritten Operanden aufweist.
  4. Vektor-Funktionseinheit nach Anspruch 3, dadurch gekennzeichnet, dass jede der N Funktionseinheiten weiterhin eine Logikschaltung zum Ausführen einer Anweisung zum Zählen von Einsen eines entsprechenden vierten Operanden aufweist.
  5. Vektor-Funktionseinheit nach Anspruch 1, dadurch gekennzeichnet, dass jede der N Funktionseinheiten mikrocodiert ist.
  6. Vektor-Funktionseinheit nach Anspruch 1, dadurch gekennzeichnet, dass die Logikschaltung, die zum Ausführen einer logischen Berechnung für die Multiply-Add-Anweisung verwendet wird, auch zum Ausführen einer logischen Berechnung für die Führende-Nullen-Anweisung verwendet wird.
  7. Verfahren, das das Ausführen von Vektoroperationen auf einem Halbleiterchip mit den folgenden Schritten aufweist: Ausführen einer ersten Vektoranweisung mit einer Vektor-Funktionseinheit, die auf dem Halbleiterchip implementiert ist; und Ausführen einer zweiten Vektoranweisung mit der Vektor-Funktionseinheit, wobei die erste Vektoranweisung eine Multiply-Add-Vektoranweisung ist und die zweite Vektoranweisung eine Vektoranweisung zum Zählen von führenden Nullen ist.
  8. Verfahren nach Anspruch 7, das weiterhin das Ausführen einer dritten Vektoranweisung mit der Funktionseinheit aufweist, wobei die dritte Vektoranweisung eine Vektoranweisung zum Zählen von abschließenden Nullen ist.
  9. Verfahren nach Anspruch 8, das weiterhin das Ausführen einer vierten Vektoranweisung mit der Funktionseinheit aufweist, wobei die vierte Vektoranweisung eine Paritätsvektoranweisung ist.
  10. Verfahren nach Anspruch 8, das weiterhin das Ausführen einer vierten Vektoranweisung mit der Funktionseinheit aufweist, wobei die vierte Vektoranweisung eine Anweisung zum Zählen von Einsen ist.
  11. Verfahren nach Anspruch 7, das weiterhin das Ausführen einer logischen Berechnung für die erste Vektoranweisung mit der gleichen Logikschaltung aufweist, die zum Ausführen einer logischen Berechnung für die zweite Vektoranweisung verwendet wird.
  12. Verfahren nach Anspruch 7, dadurch gekennzeichnet, dass die logische Berechnung für die erste Vektoranweisung das Ermitteln von führenden Einsen umfasst.
  13. Rechensystem mit: einem Flachbildschirm und einem Prozessor, der auf einem Halbleiterchip implementiert ist, wobei der Prozessor eine Vektor-Funktionseinheit zum Ausführen von Vektoroperationen mit der Dimension N hat, wobei die Vektor-Funktionseinheit Folgendes aufweist: N Funktionseinheiten, wobei jede der N Funktionseinheiten eine Logikschaltung aufweist, um Folgendes auszuführen: eine Multiply-Add-Anweisung an entsprechenden Operanden A, B und C und eine Führende-Nullen-Anweisung an einem entsprechenden ersten Operanden.
  14. Rechensystem nach Anspruch 13, dadurch gekennzeichnet, dass jede der N Funktionseinheiten weiterhin eine Logikschaltung zum Ausführen einer Abschließende-Nullen-Anweisung an einem entsprechenden zweiten Operanden aufweist.
  15. Rechensystem nach Anspruch 14, dadurch gekennzeichnet, dass jede der N Funktionseinheiten weiterhin eine Logikschaltung zum Ausführen einer Paritätsanweisung an einem entsprechenden dritten Operanden aufweist.
  16. Rechensystem nach Anspruch 15, dadurch gekennzeichnet, dass jede der N Funktionseinheiten weiterhin eine Logikschaltung zum Ausführen einer Anweisung zum Zählen von Einsen in einem entsprechenden vierten Operanden aufweist.
  17. Rechensystem nach Anspruch 13, dadurch gekennzeichnet, dass jede der N Funktionseinheiten mikrocodiert ist.
  18. Rechensystem nach Anspruch 13, dadurch gekennzeichnet, dass die Logikschaltung, die zum Ausführen einer logischen Berechnung für die Multiply-Add-Anweisung verwendet wird, auch zum Ausführen einer logischen Berechnung für die Führende-Nullen-Anweisung verwendet wird.
DE112011103195T 2010-09-24 2011-09-23 Funktionseinheit zur Berechnung von führenden Nullen von Vektoren, von abschließenden Nullen von Vektoren, der Anzahl von Einsen von Vektoroperanden und der Vektorparität Withdrawn DE112011103195T5 (de)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/890,457 US9092213B2 (en) 2010-09-24 2010-09-24 Functional unit for vector leading zeroes, vector trailing zeroes, vector operand 1s count and vector parity calculation
US12/890,457 2010-09-24
PCT/US2011/052889 WO2012040539A2 (en) 2010-09-24 2011-09-23 Functional unit for vector leading zeroes, vector trailing zeroes, vector operand 1s count and vector parity calculation

Publications (1)

Publication Number Publication Date
DE112011103195T5 true DE112011103195T5 (de) 2013-06-27

Family

ID=45871878

Family Applications (1)

Application Number Title Priority Date Filing Date
DE112011103195T Withdrawn DE112011103195T5 (de) 2010-09-24 2011-09-23 Funktionseinheit zur Berechnung von führenden Nullen von Vektoren, von abschließenden Nullen von Vektoren, der Anzahl von Einsen von Vektoroperanden und der Vektorparität

Country Status (9)

Country Link
US (1) US9092213B2 (de)
JP (1) JP5636110B2 (de)
KR (1) KR101517762B1 (de)
CN (2) CN103119578B (de)
BR (1) BR112013008616A2 (de)
DE (1) DE112011103195T5 (de)
GB (1) GB2497455B (de)
TW (1) TWI547868B (de)
WO (1) WO2012040539A2 (de)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8667042B2 (en) * 2010-09-24 2014-03-04 Intel Corporation Functional unit for vector integer multiply add instruction
ES2943248T3 (es) 2011-04-01 2023-06-12 Intel Corp Formato de instrucción compatible con vectores y ejecución del mismo
CN104011670B (zh) 2011-12-22 2016-12-28 英特尔公司 用于基于向量写掩码的内容而在通用寄存器中存储两个标量常数之一的指令
US9372692B2 (en) 2012-12-29 2016-06-21 Intel Corporation Methods, apparatus, instructions, and logic to provide permute controls with leading zero count functionality
US9323531B2 (en) * 2013-03-15 2016-04-26 Intel Corporation Systems, apparatuses, and methods for determining a trailing least significant masking bit of a writemask register
US11544214B2 (en) 2015-02-02 2023-01-03 Optimum Semiconductor Technologies, Inc. Monolithic vector processor configured to operate on variable length vectors using a vector length register
US10387150B2 (en) * 2015-06-24 2019-08-20 International Business Machines Corporation Instructions to count contiguous register elements having a specific value in a selected location
JP6616608B2 (ja) * 2015-07-16 2019-12-04 ルネサスエレクトロニクス株式会社 半導体装置
GB2553783B (en) 2016-09-13 2020-11-04 Advanced Risc Mach Ltd Vector multiply-add instruction
WO2019005165A1 (en) 2017-06-30 2019-01-03 Intel Corporation METHOD AND APPARATUS FOR VECTORIZING INDIRECT UPDATING BUCKLES
US10628295B2 (en) 2017-12-26 2020-04-21 Samsung Electronics Co., Ltd. Computing mechanisms using lookup tables stored on memory
JP6540841B1 (ja) 2018-02-27 2019-07-10 富士通株式会社 演算処理装置、情報処理装置、情報処理方法、およびプログラム
EP3857353B1 (de) * 2018-09-27 2023-09-20 Intel Corporation Vorrichtungen und verfahren zur beschleunigung der matrixmultiplikation
CN110221808B (zh) * 2019-06-03 2020-10-09 深圳芯英科技有限公司 向量乘加运算的预处理方法、乘加器及计算机可读介质

Family Cites Families (49)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4852048A (en) * 1985-12-12 1989-07-25 Itt Corporation Single instruction multiple data (SIMD) cellular array processing apparatus employing a common bus where a first number of bits manifest a first bus portion and a second number of bits manifest a second bus portion
US4849923A (en) 1986-06-27 1989-07-18 Digital Equipment Corporation Apparatus and method for execution of floating point operations
US4852039A (en) 1987-06-19 1989-07-25 Digital Equipment Corporation Apparatus and method for accelerating floating point addition and subtraction operations by accelerating the effective subtraction procedure
US5317527A (en) 1993-02-10 1994-05-31 Digital Equipment Corporation Leading one/zero bit detector for floating point operation
US5341319A (en) * 1993-02-10 1994-08-23 Digital Equipment Corporation Method and apparatus for controlling a rounding operation in a floating point multiplier circuit
US5784305A (en) 1995-05-01 1998-07-21 Nec Corporation Multiply-adder unit
US6058465A (en) 1996-08-19 2000-05-02 Nguyen; Le Trong Single-instruction-multiple-data processing in a multimedia signal processor
US5993051A (en) * 1996-11-18 1999-11-30 Samsung Electronics Co., Ltd. Combined leading one and leading zero anticipator
KR100291383B1 (ko) 1996-11-18 2001-09-17 윤종용 디지털신호처리를위한명령을지원하는모듈계산장치및방법
US5928316A (en) 1996-11-18 1999-07-27 Samsung Electronics Co., Ltd. Fused floating-point multiply-and-accumulate unit with carry correction
US6401194B1 (en) 1997-01-28 2002-06-04 Samsung Electronics Co., Ltd. Execution unit for processing a data stream independently and in parallel
US5991531A (en) 1997-02-24 1999-11-23 Samsung Electronics Co., Ltd. Scalable width vector processor architecture for efficient emulation
US6256655B1 (en) * 1998-09-14 2001-07-03 Silicon Graphics, Inc. Method and system for performing floating point operations in unnormalized format using a floating point accumulator
US6578059B1 (en) 1998-10-10 2003-06-10 Institute For The Development Of Emerging Architectures, L.L.C. Methods and apparatus for controlling exponent range in floating-point calculations
US6292886B1 (en) 1998-10-12 2001-09-18 Intel Corporation Scalar hardware for performing SIMD operations
US6378067B1 (en) 1998-10-12 2002-04-23 Idea Corporation Exception reporting architecture for SIMD-FP instructions
US6321327B1 (en) 1998-12-30 2001-11-20 Intel Corporation Method for setting a bit associated with each component of packed floating-pint operand that is normalized in SIMD operations
US6480872B1 (en) 1999-01-21 2002-11-12 Sandcraft, Inc. Floating-point and integer multiply-add and multiply-accumulate
US6360241B1 (en) 1999-02-01 2002-03-19 Compaq Information Technologies Goup, L.P. Computer method and apparatus for division and square root operations using signed digit
US6366942B1 (en) 1999-02-01 2002-04-02 Compaq Information Technologies Group Lp Method and apparatus for rounding floating point results in a digital processing system
US6732135B1 (en) 1999-02-01 2004-05-04 Hewlett-Packard Development Company, L.P. Method and apparatus for accumulating partial quotients in a digital processor
US6324638B1 (en) 1999-03-31 2001-11-27 International Business Machines Corporation Processor having vector processing capability and method for executing a vector instruction in a processor
US7127483B2 (en) 2001-12-26 2006-10-24 Hewlett-Packard Development Company, L.P. Method and system of a microprocessor subtraction-division floating point divider
US8090928B2 (en) 2002-06-28 2012-01-03 Intellectual Ventures I Llc Methods and apparatus for processing scalar and vector instructions
US7831804B2 (en) 2004-06-22 2010-11-09 St Microelectronics S.R.L. Multidimensional processor architecture
WO2006030349A1 (en) * 2004-09-15 2006-03-23 Koninklijke Philips Electronics N.V. Coder and a method of coding for codes having a rmtr constraint of r=2
US7225323B2 (en) 2004-11-10 2007-05-29 Nvidia Corporation Multi-purpose floating point and integer multiply-add functional unit with multiplication-comparison test addition and exponent pipelines
US7543119B2 (en) 2005-02-10 2009-06-02 Richard Edward Hessel Vector processor
US20060179092A1 (en) * 2005-02-10 2006-08-10 Schmookler Martin S System and method for executing fixed point divide operations using a floating point multiply-add pipeline
JP2006227939A (ja) 2005-02-17 2006-08-31 Matsushita Electric Ind Co Ltd 演算装置
US7584233B2 (en) * 2005-06-28 2009-09-01 Qualcomm Incorporated System and method of counting leading zeros and counting leading ones in a digital signal processor
US20070198815A1 (en) 2005-08-11 2007-08-23 Coresonic Ab Programmable digital signal processor having a clustered SIMD microarchitecture including a complex short multiplier and an independent vector load unit
US20070074008A1 (en) * 2005-09-28 2007-03-29 Donofrio David D Mixed mode floating-point pipeline with extended functions
US7912887B2 (en) * 2006-05-10 2011-03-22 Qualcomm Incorporated Mode-based multiply-add recoding for denormal operands
US20090063608A1 (en) 2007-09-04 2009-03-05 Eric Oliver Mejdrich Full Vector Width Cross Product Using Recirculation for Area Optimization
US20090106526A1 (en) 2007-10-22 2009-04-23 David Arnold Luick Scalar Float Register Overlay on Vector Register File for Efficient Register Allocation and Scalar Float and Vector Register Sharing
US7809925B2 (en) 2007-12-07 2010-10-05 International Business Machines Corporation Processing unit incorporating vectorizable execution unit
US7945764B2 (en) 2008-01-11 2011-05-17 International Business Machines Corporation Processing unit incorporating multirate execution unit
US8356160B2 (en) 2008-01-15 2013-01-15 International Business Machines Corporation Pipelined multiple operand minimum and maximum function
US8046399B1 (en) * 2008-01-25 2011-10-25 Oracle America, Inc. Fused multiply-add rounding and unfused multiply-add rounding in a single multiply-add module
US8139061B2 (en) 2008-08-01 2012-03-20 International Business Machines Corporation Floating point execution unit for calculating a one minus dot product value in a single pass
US8244783B2 (en) * 2008-09-11 2012-08-14 International Business Machines Corporation Normalizer shift prediction for log estimate instructions
US8281111B2 (en) * 2008-09-23 2012-10-02 Qualcomm Incorporated System and method to execute a linear feedback-shift instruction
US8326904B2 (en) * 2009-01-27 2012-12-04 International Business Machines Corporation Trigonometric summation vector execution unit
US8555034B2 (en) 2009-12-15 2013-10-08 Oracle America, Inc. Execution of variable width vector processing instructions
US8606840B2 (en) 2010-03-17 2013-12-10 Oracle International Corporation Apparatus and method for floating-point fused multiply add
US8629867B2 (en) 2010-06-04 2014-01-14 International Business Machines Corporation Performing vector multiplication
US20110320765A1 (en) 2010-06-28 2011-12-29 International Business Machines Corporation Variable width vector instruction processor
US8676871B2 (en) 2010-09-24 2014-03-18 Intel Corporation Functional unit capable of executing approximations of functions

Also Published As

Publication number Publication date
TWI547868B (zh) 2016-09-01
KR101517762B1 (ko) 2015-05-06
GB2497455A (en) 2013-06-12
US9092213B2 (en) 2015-07-28
BR112013008616A2 (pt) 2016-06-14
JP5636110B2 (ja) 2014-12-03
KR20130062352A (ko) 2013-06-12
JP2013543173A (ja) 2013-11-28
US20120079253A1 (en) 2012-03-29
WO2012040539A3 (en) 2012-07-05
CN103119578B (zh) 2016-08-03
WO2012040539A2 (en) 2012-03-29
TW201229888A (en) 2012-07-16
CN103119578A (zh) 2013-05-22
CN106126194A (zh) 2016-11-16
GB201303912D0 (en) 2013-04-17
GB2497455B (en) 2017-08-09

Similar Documents

Publication Publication Date Title
DE112011103196T5 (de) Funktionseinheit für eine Multiply-ADD-Anweisung für ganzzahlige Vektoren
DE112011103195T5 (de) Funktionseinheit zur Berechnung von führenden Nullen von Vektoren, von abschließenden Nullen von Vektoren, der Anzahl von Einsen von Vektoroperanden und der Vektorparität
DE112011103206B4 (de) Prozessor und Rechensystem mit einer Multiplizieraddierfunktionseinheit zum Ausführen von Scale-, Round-, Getexp-, Round-, Getmant-, Reduce-, Range- und Class-Befehlen und Verfahren hierfür
DE102008059371B4 (de) Funktionseinheit für verschmolzenes Multiplizieren und Addieren
DE69233361T2 (de) Ein-Chip-Mikrocomputer
DE102007063809B3 (de) Anweisungen und Logik zur Verarbeitung von Zeichenketten
DE112007001989B4 (de) Ausführung von Rundungsoperationen entsprechend einer Anweisung
DE69821957T2 (de) Datenprozessor mit paralleler decodierung und ausführung von daten- und adressbefehlen
DE4414172C2 (de) Gleit-Komma-Arithmetikeinheit und Verfahren zur Division und Quadratwurzelberechnung, die eine modifizierte Newton-Raphson Technik verwendet
DE102018005105A1 (de) Befehle für entfernte atomare operationen
DE102009030525A1 (de) Effizientes Paralleles Behandeln von Gleitkomma-Ausnahmen in einem Prozessor
DE112013005416T5 (de) Verfahren, Vorrichtungen, Befehle und Logik zum Bereitstellen von Vektoradressenkonflikt-Detektionsfunktionalität
DE112007002101T5 (de) Instruktion und Logik zur Durchführung einer Skalarprodukt-Operation
DE102008016533A1 (de) Verfahren und Vorrichtung zum Durchführen von multiplikativen Funktionen
DE112011103211T5 (de) Auf einem Halbleiterchip implementierte vektorlogische Reduktionsoperation
DE112013003743T5 (de) Beschleunigte spurübergreifende Vektorreduzierungsbefehle
DE112013003741T5 (de) Systeme, Vorrichtungen und Verfahren zum Durchführen einer Konfliktdetektion unf einer Übertragung von Inhalten eines Registers an Datenelementpositionen eines anderen Registers
DE112018000140T5 (de) Verschmolzene Multiplikations-Additions-Gleitkommaoperationen auf 128 BIT breiten Operanden
DE102018001229A1 (de) Beschleunigerschaltung mit variabler Wortlänge für ein neuronales Netzwerk
DE102018005859A1 (de) Einrichtung und Verfahren zur Multiplikation und Akkumulation von komplexen und echten gepackten Datenelementen
DE102014002510A1 (de) Präzise Ausnahmesignalisierung für Mehrfachdatenarchitektur
DE102018006798A1 (de) Einrichtung und Verfahren zum Multiplizieren, Addieren/Subtrahieren und Akkumulieren von gepackten Datenelementen
DE102014003659A1 (de) Systeme, vorrichtungen und verfahren zum bestimmen eines folgenden niedrigstwertigen maskierungsbits eines schreibmaskenregisters
DE102018132200A1 (de) Vorrichtung und verfahren zum verarbeiten von fraktionalen umkehroperationen
DE112020005987T5 (de) Setzen von prüfpunkten in akkumulatorregister-ergebnissen in einem mikroprozessor

Legal Events

Date Code Title Description
R012 Request for examination validly filed
R082 Change of representative

Representative=s name: BOEHMERT & BOEHMERT ANWALTSPARTNERSCHAFT MBB -, DE

Representative=s name: BOEHMERT & BOEHMERT, DE

R119 Application deemed withdrawn, or ip right lapsed, due to non-payment of renewal fee