2015-09-01 20 views
5

Ho dato un'occhiata al manuale dello sviluppatore del software x64 e sembra che le istruzioni {MIN | MAX} {S | P} {S | D} incorporate non implementino le funzioni chiamate minNum e maxNum nello standard IEEE 754, nonostante Intel sostenga nello stesso documento che le proprie CPU sono pienamente conformi.Architettura Intel e conformità IEEE 754 (minNum e maxNum)?

operazioni

Intel restituiscono sempre il secondo operando se uno degli operandi è un QNAN e nessuno dei due è uno Snan, mentre minNum e MAXNUM restituiscono il altro operando, vale a dire:

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 

Ho ragione che di serie -le funzioni minNum/maxNum conformi devono essere emulate con un'ulteriore verifica del primo operando e non possono essere tradotte direttamente nelle istruzioni corrispondenti?

+0

tutti * * pretese di essere compatibile con IEEE 754 ... –

+0

Ricerca di 'IEEE' nel manuale di riferimento di istruzioni Intel trova un paio di casi in cui è fatto riferimento per istruzioni legacy x87: 'FPREM' (resto) arrotonda in modo diverso da IEEE, ma' FPREM1' "calcola il resto specificato nello standard IEEE 754". Quindi credo che nel corso della giornata, Intel ha aggiunto una nuova versione di un'istruzione per fare l'arrotondamento al modo specificato da IEEE. È possibile che possano introdurre nuove versioni delle istruzioni SSE 'min' e' max', dal momento che probabilmente c'è spazio per altri opcode negli spazi di codifica VEX (AVX) ed EVEX (AVX512). –

risposta

3

Sì, avete bisogno di ulteriori istruzioni.

Si è discusso in this comment on a Julia issue thread dall'Arch Robinson:

La semantica di minsd sono stati progettati indietro negli anni '90, ben prima IEEE 754-2008, in modo che i compilatori potrebbero ottimizzare l'idioma comune C x<y?x:y.

Il problema prosegue suggerendo una sequenza di istruzioni AVX per renderlo avvelenamento da NaN. Se invece si desidera un comportamento IEEE, allora si potrebbe utilizzare

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

Sono venuto qui per fare questa domanda dopo aver letto questo numero! Non posso credere di averlo perso. – Alexey

Problemi correlati