2015-09-01 5 views
5

Ich habe mir das x64-Softwareentwickler-Handbuch angesehen und es sieht so aus, als ob die eingebauten {MIN | MAX} {S | P} {S | D} -Anweisungen die Funktionen minNum und maxNum nicht implementieren im IEEE 754-Standard, obwohl Intel im selben Dokument behauptet, dass ihre CPUs vollständig kompatibel sind.Intel-Architektur und IEEE 754-Konformität (minNum und maxNum)?

Intel Operationen zurückkehren immer die Sekunden Operanden, wenn einer der Operanden ein QNaN ist und weder eine SNaN, während minNum und MAXNUM die anderen Operand zurückzukehren, das heißt:

IEE 754: 
minNum(1.0, QNaN) -> 1.0 
minNum(QNaN, 1.0) -> 1.0 

Intel x64: 
MIN(1.0, QNaN) -> QNaN 
MIN(QNaN, 1.0) -> 1.0 

Bin ich diesen Standard korrigieren -konforme minNum/maxNum-Funktionen müssen mit einer zusätzlichen Prüfung des ersten Operanden emuliert werden und können nicht direkt in die entsprechenden Anweisungen übersetzt werden?

+0

jeden benutzen * Ansprüche * IEEE 754-kompatibel zu sein ... –

+0

Suche nach 'IEEE' in dem Befehlsreferenzhandbuch Intel findet ein paar Fälle, in denen es bezeichnet ist für Legacy x87-Anweisungen: 'FPREM' (Rest) wird anders als IEEE gerundet, aber' FPREM1' berechnet den Rest, der in IEEE Standard 754 spezifiziert ist. Also ich denke, damals hat Intel eine neue Version einer Anweisung hinzugefügt, um den IEEE-spezifizierten Weg zu runden. Es ist möglich, dass sie neue Versionen der SSE- "min" - und "max" -Instruktionen einführen können, da wahrscheinlich mehr Platz für weitere Opcodes in den VX (AVX) - und EVEX (AVX512) -Codierungsräumen vorhanden ist. –

Antwort

3

Ja, Sie werden zusätzliche Anweisungen benötigen.

Es wird in this comment on a Julia issue thread von Arch Robinson diskutiert:

Die Semantik minsd wurden zurück in den 90er Jahren entwickelt, also lange vor IEEE 754-2008, so dass Compiler das gemeinsame C Idiom x<y?x:y optimieren könnte.

Das Problem geht weiter, um eine Folge von AVX-Anweisungen für die Herstellung von NaN-Vergiftung vorzuschlagen. Wenn Sie stattdessen IEEE Verhalten will, dann könnte man

VMIN R, a, b   // result is b if a or b are NaN, min(a,b) otherwise 
         // so Nan is not propagated only if a is the NaN 
VCMPNEQ M, b, b  // M=11…11 if b is NaN, 0 otherwise 
VBLENDV Res, R, a, M // Res = R if M=0 (b not NaN), otherwise Res=a (if b is NaN) 
+0

Ich bin hierher gekommen, um diese Frage zu stellen, nachdem ich gerade dieses Problem gelesen habe! Ich kann nicht glauben, dass ich das vermisst habe. – Alexey

Verwandte Themen