2015-05-13 17 views
6

Ich habe die Anweisungen in AVX-512 gelesen und eine Reihe von fixup Anweisungen bemerkt. Einige examples:Was ist mit "reparieren" Schwimmer gemeint?

_mm512_fixupimm_pd, 
_mm512_mask_fixupimm_pd, 
_mm512_maskz_fixupimm_pd 

_mm512_fixupimm_round_pd, 
_mm512_mask_fixupimm_round_pd, 
_mm512_maskz_fixupimm_round_pd 

Was hier gemeint ist, durch "fixing up"?

Antwort

4

Das ist eine gute Frage. Intels Antwort (mein fett) ist hier:

Dieser Befehl speziell für den Einsatz bei der Festsetzung bis die Ergebnisse der arithmetischen Berechnungen mit einer Hand vorgesehen ist, so dass sie die Spezifikation entsprechen, obwohl es für die Befestigung oben im Allgemeinen nützlich ist die Ergebnisse von Mehrfachbefehlssequenzen, um Sondernummern Eingaben widerzuspiegeln. Betrachten Sie zum Beispiel rcp (0). Geben Sie 0 bis rcp ein, und Sie sollten INF gemäß der DX10-Spezifikation erhalten. Jedoch ergibt die Auswertung von rcp über Newton-Raphson, wobei x = ungefähr (1/0), ein falsches Ergebnis. Zu damit umgehen, kann VFIXUPIMMPS nach der N-R reziproke Sequenz verwendet werden, um das Ergebnis auf den richtigen Wert (d. H. INF, wenn der Eingang ist 0).

Suchen Sie nach VFIXUPIMMPD in:

https://software.intel.com/sites/default/files/managed/0d/53/319433-022.pdf

+0

Das ist viel detaillierter als ihre Online-Dokumentation, danke für die Referenz! –

+0

Es ist immer noch ein ziemlich mieses Handbuch, wenn Sie mich fragen. Nicht die normale Qualität des Schreibens. Wenn ich eine CPU-Unterstützung AVX-512 hätte, würde ich es ausprobieren und sehen, was tatsächlich passiert;) – JCx

+1

@JCx: Ich denke, die Pseudo-Code-Beschreibung dessen, was es tut, ist detailliert genug (die 'Operation'-Sektion). Der Absatz, den Sie angeben, gibt Ihnen nur den Anwendungsfall, nicht die operativen Details. Zusammenfassung: kategorisieren Sie es für jedes src-Element als einen von acht "Token" -Typen. Verwenden Sie dieses Token, um eine Aktion im entsprechenden Element des dritten Operanden (eine Tabelle mit acht 4-Bit-Codes) nachzuschlagen. Die Aktion kann dest = dest, dest = src, dest = NaN, dest = +/- Inf, dest = +/- 0, dest = pi/2 oder einige andere Dinge. Beachten Sie, dass dest auch ein Eingabeoperand ist, auch wenn keine Schreibmaske vorhanden ist. –

2

Intel Beschreibung in ihren "future extensions" instruction set reference manual hat den üblichen Operation Abschnitt, der vollständig spezifiziert, welche Bits gehen, wo.

Die Intrinsics Guide reproduziert auch die Operation Abschnitt, die eine nette Abwechslung von einigen anderen schlecht dokumentierten Einträge im Intrinsics Guide ist. Oder vielleicht ist es eine neue Ergänzung. Es lässt immer noch die Tabellen und Diagramme weg. Normalerweise finde ich das Insn-Ref-Handbuch nützlicher, außer manchmal, wenn ich nach Anweisungen suche, an die ich vielleicht nicht gedacht oder von denen ich nichts weiß.

Der Abschnitt Betrieb für diesen Befehl ist lang und schwer zu grok, und die Textbeschreibung Englisch ist nur eine grobe Zusammenfassung:

Perform Fix-up in doppelter Genauigkeit codiert Quadwortelemente floating -Punktformat im ersten Quelloperanden (zweiter Operand) unter Verwendung einer 32-Bit-Zwei-Ebenen-Nachschlagetabelle, die im entsprechenden Vierfachwort-Element des zweiten Quelloperanden (dritter Operand) mit Ausnahmeberichtsspezifizierer imm8 angegeben ist

...

Die zweistufige Nachschlagetabelle führt eine Korrektur jeder DP-FP-Eingangsdaten im ersten Quelloperanden durch, indem die Eingangsdaten in 8 Tokentypen dekodiert werden. Für jeden Tokentyp wird eine Antworttabelle definiert, die die Eingabecodierung im ersten Quelloperanden mit einer von 16 Antwortaktionen konvertiert.

Der beabsichtigte Anwendungsfall ist:

  • DEST = Ergebnis rcppd (oder ähnlich) + Newton- Raphson-Iteration
  • src = Eingabe in die Approximation + Verfeinerungs
  • table = Fixup Tabelle. Kann ein Broadcast-Speicheroperand sein, so dass nur 64 oder 32 Bit Speicher in dem allgemeinen Fall benötigt werden, in dem die gleiche Tabelle für jedes Element eines Vektors gewünscht wird. (Die Tabelle ist nur 32b für die einfache und die doppelte Genauigkeit, aber die Broadcast-Option der DP-Version ist m64bcst. Es ist in Ordnung, wenn die oberen 32 Bit unbrauchbar sind, aber nicht, um eine Seitengrenze in eine nicht zugeordnete Seite zu kreuzen Fehler wahrscheinlich)

Vielleicht ein ausführlichere englische wäre nützlich, um die Lücke zwischen dieser sehr groben Zusammenfassung zu überbrücken und der vollen Pseudo-Code.

Für jedes src Element:

  • tsrc = Leuchtet die Denormalität auf Null, wenn MXCSR.DAZ eingestellt ist. Der ursprüngliche src wird danach überhaupt nicht mehr verwendet: es gibt keine dest=src Aktion, nur dest=tsrc.

  • Kategorisieren tsrc als einer von acht "Token" -Typen (QNAN, SNAN, Null, +1, -Inf, + Inf, negativer Wert, positiver Wert). Wenn das imm8 nicht Null ist, werden Ausnahmen ausgelöst, wenn ein Token des passenden Typs gefunden wird.

  • Verwenden Sie dieses Kategorie-Token zum Suchen einer Aktion im entsprechenden Element des dritten Operanden (eine Tabelle mit acht 4-Bit-Codes, einer für jedes Token).

  • Die Aktion kann eine der folgenden sein: dest = dest, dest = tsrc, dest = NaN, dest = +/- Inf, dest = Inf mit dem Vorzeichen von tsrc, dest = +/- 0, dest = +/-1, dest = 1/2, dest = 90,0, dest = pi/2 oder dest = MAX/MIN_FLOAT. Informationen dazu, welcher Code welcher Aktion zugeordnet ist, finden Sie in der Dokumentation von Intel.

Dieser Vorgang wird für jedes Vektorelement separat durchgeführt.

Eine typische Verwendung würde den Code dest=dest für alle Fälle setzen, in denen die Ergebnisse, die wir beheben, bereits korrekt sind. Beachten Sie, dass dest aufgrund der Aktion dest=dest auch ein Eingabeoperand ist, auch ohne Schreibmaske.