2015-09-01 18 views
5

Zajrzałem do podręcznika programisty x64 i wygląda na to, że wbudowane instrukcje {MIN | MAX} {S | P} {S | D} nie implementują funkcji o nazwach minNum i maxNum w standardzie IEEE 754, mimo że Intel twierdzi w tym samym dokumencie, że jego procesory są w pełni zgodne.Architektura Intel i zgodność z IEEE 754 (minNum i maxNum)?

operacje

Intel zawsze zwróci drugą argument, jeśli którykolwiek z operandów jest QNaN i nie stanowi SNaN, natomiast minNum i MAXNUM zwrócić inne argument, a mianowicie:

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 

Czy mam rację, że standardy -potrzebne funkcje minNum/maxNum muszą być emulowane z dodatkowym sprawdzeniem pierwszego operandu i nie mogą być bezpośrednio przetłumaczone na odpowiednie instrukcje?

+0

wszystkich roszczeń * * Aby być zgodny ze standardem IEEE 754 ... –

+0

wyszukiwania dla 'IEEE' w podręczniku instrukcji Intel znajdzie kilka przypadków, gdzie jest to określone dla starsze instrukcje x87: 'FPREM' (reszta) zaokrągla inaczej niż IEEE, ale' FPREM1' "oblicza resztę określoną w IEEE Standard 754". Więc przypuszczam, że w tamtych czasach Intel dodał nową wersję instrukcji do zaokrąglania w sposób określony przez IEEE. Możliwe, że mogliby wprowadzić nowe wersje instrukcji SSE 'min' i' max', ponieważ prawdopodobnie jest trochę miejsca na więcej kodów w przestrzeniach kodowania VEX (AVX) i EVEX (AVX512). –

Odpowiedz

3

Tak, będziesz potrzebować dodatkowych instrukcji.

To jest omówione w this comment on a Julia issue thread Arch Robinson:

Semantyka minsd zostały zaprojektowane jeszcze w latach 90., na długo przed IEEE 754-2008, tak że kompilatory mógł zoptymalizować wspólny C idiom x<y?x:y.

Problem dalej sugeruje sekwencję instrukcji AVX dotyczących zatrucia NaN. Jeśli zamiast tego chcesz IEEE zachowanie, wówczas można użyć

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

Przyszedłem tutaj, aby zadać to pytanie po przeczytaniu tego problemu! Nie mogę uwierzyć, że to przegapiłem. – Alexey

Powiązane problemy