Perché i numeri decimali a virgola mobile non sono accelerati come i numeri binari a virgola mobile?

StackOverflow https://stackoverflow.com/questions/1447215

  •  22-07-2019
  •  | 
  •  

Domanda

Ne vale la pena implementarlo nell'hardware? Se si perchè? In caso contrario, perché no?


Mi dispiace, ho pensato che fosse chiaro che sto parlando di numeri razionali decimali! Ok qualcosa come decNumber ++ per C ++, decimale per .NET ... Spero sia chiaro ora: )

È stato utile?

Soluzione

L'ultima revisione dello IEEE 754: 2008 definisce effettivamente il decimale hardware mobile numeri di punti, usando le rappresentazioni mostrate nel software a cui si fa riferimento nella domanda. La versione precedente dello standard ( IEEE 754: 1985 ) non forniva numeri decimali in virgola mobile . La maggior parte dell'hardware attuale implementa lo standard del 1985 e non quello del 2008, ma i computer iSeries di IBM che utilizzano Power6 chips dispone di tale supporto, così come z10 mainframe.

Lo sforzo di standardizzazione per il virgola mobile decimale è stato guidato da Mike Cowlishaw di IBM UK, che ha un sito web pieno di informazioni utili (incluso il software nella domanda). È probabile che, a tempo debito, altri produttori di hardware introdurranno anche unità decimali in virgola mobile sui loro chip, ma non ho sentito una dichiarazione di direzione per quando (o se) Intel potrebbe aggiungerne una. Intel ha ottimizzato librerie software per esso.

Il Comitato per gli standard C sta cercando di aggiungere il supporto per il virgola mobile decimale e quel lavoro è TR 24732.

Altri suggerimenti

Alcuni processori IBM dispongono di hardware decimale dedicato incluso (virgola mobile decimale | unità DFP).

In contributo di risposto il 18 settembre alle 23:43 Daniel Pryden

il motivo principale è che le unità DFP necessitano di più transistor in un chip rispetto alle unità BFP. Il motivo è il codice BCD per calcolare i numeri decimali in un ambiente binario. L'IEEE754-2008 ha diversi metodi per ridurre al minimo il sovraccarico. Sembra che il metodo DPD hxxp: //en.wikipedia.org/wiki/Densely_packed_decimal sia più efficace rispetto al metodo BID hxxp: //en.wikipedia.org/wiki/Binary_Integer_Decimal.

Normalmente, sono necessari 4 bit per coprire l'intervallo decimale da 0 a 9. I bit da 10 a 15 non sono validi ma sono ancora possibili con BCD. Pertanto, DPD comprime 3 * 4 = 12 bit in 10 bit per coprire l'intervallo da 000 a 999 con 1024 (10 ^ 2) possibilità.

In generale, vale a dire che BFP è più veloce di DFP. E BFP ha bisogno di meno spazio su un chip rispetto a DFP.

La domanda sul perché IBM abbia implementato un'unità DFP ha una risposta abbastanza semplice: Costruiscono server per il mercato finanziario. Se i dati rappresentano denaro, dovrebbero essere affidabili.

Con l'aritmetica decimale con accelerazione hardware, alcuni errori non si verificano come in binario. 1/5 = 0.2 = > 0.0110011001100110011001100110 ... in binario in modo da evitare frazioni ricorrenti.

E la funzione overhelming round () in Excel sarebbe più inutile: D (- > function = 1 * (0,5-0,4-0,1) wtf!)

spero che spieghi un po 'la tua domanda!

C'è (un po 'di) accelerazione decimale della stringa, ma ...

Questa è una buona domanda. La mia prima reazione è stata "le macro operazioni non sono sempre riuscite a dimostrare" , ma dopo averci pensato, ciò di cui stai parlando sarebbe molto più veloce se implementato in un'unità funzionale. Immagino che ciò dipenda dal fatto che tali operazioni siano abbastanza importanti. C'è una storia piuttosto spiacevole di macro op e istruzioni specifiche per applicazioni specifiche, e in particolare i precedenti tentativi di formati finanziari decimali sono solo bagaglio legacy ora. Ad esempio, dubito che vengano utilizzati molto, ma ogni PC ha i codici operativi Intel BCD , che consistono in

DAA, AAA, AAD, AAM, DAS, AAS

C'era una volta, le istruzioni decimali delle stringhe erano comuni sull'hardware di fascia alta. Non è chiaro che abbiano mai fatto molta differenza nel benchmark. I programmi impiegano molto tempo a testare, ramificare, spostare oggetti e calcolare indirizzi. Normalmente non ha senso inserire le macro-operazioni nell'architettura del set di istruzioni, perché nel complesso le cose sembrano andare più veloci se si dà alla CPU il minor numero di cose fondamentali da fare, in modo da poter mettere tutte le sue risorse nel farle come il più velocemente possibile.

Al giorno d'oggi, nemmeno tutte le operazioni binarie sono in realtà nel reale ISA. La cpu traduce l'ISA legacy in micro-op in fase di esecuzione. Fa tutto parte dell'andare veloce specializzandosi in operazioni di base. Per ora i transistor rimasti sembrano essere in attesa di alcuni lavori grafici e 3D, ad esempio MMX, SSE, 3DNow!

Suppongo sia possibile che un progetto di foglio pulito possa fare qualcosa di radicale e unificare i formati attuali (HW) scientifici e decimali (SW) in virgola mobile, ma non trattenere il respiro.

No, sono molto inefficienti dalla memoria. E i calcoli sono anche su hardware non facili da implementare (ovviamente può essere fatto, ma può anche impiegare molto tempo). Un altro svantaggio del formato decimale è che non è ampiamente utilizzato, prima che la ricerca mostrasse che i numeri in formato binario erano più precisi, il formato era popolare per un certo periodo. Ma ora i programmatori lo sanno meglio. Il formato decimale non è efficiente ed è più smarrito. Inoltre, ulteriori rappresentazioni hardware richiedono set di istruzioni aggiuntivi, che possono portare a codici più difficili.

L'hardware che desideri era abbastanza comune.

Le CPU precedenti avevano un'aritmetica BCD hardware (decimale con codice Binaray). (I piccoli chip Intel avevano un piccolo supporto, come notato dai precedenti poster)

BCD hardware è stato molto bravo a velocizzare FORTRAN che ha usato BCD a 80 bit per i numeri.

Il calcolo scientifico utilizzato per costituire una percentuale significativa del mercato mondiale.

Dal momento che tutti (relativamente parlando) hanno ottenuto il PC di casa con Windows, il mercato è diventato minuscolo in percentuale. Quindi nessuno lo fa più.

Dato che non ti dispiace avere doppi a 64 bit (punto mobile binario) per la maggior parte delle cose, funziona principalmente.

Se si utilizza la virgola mobile binaria a 128 bit su moderne unità hardware vettoriali non è poi così male. Ancora meno preciso del BCD a 80 bit, ma lo ottieni.

In un lavoro precedente, un collega precedentemente di JPL era stupito che usassimo ancora FORTRAN. " Ci siamo convertiti in C e C ++, ci ha detto. " Gli ho chiesto come hanno risolto il problema della mancanza di precisione. Non l'avevano notato. (Non hanno anche la stessa precisione di atterraggio della sonda spaziale che avevano. Ma a chiunque può mancare un pianeta.)

Quindi, sostanzialmente i doppi a 128 bit nell'unità vettoriale sono più a posto e ampiamente disponibili.

I miei venti centesimi. Si prega di non rappresentarlo come un numero in virgola mobile :)

Lo standard decimale in virgola mobile (IEEE 754-2008) è già implementato nell'hardware da due società; server basati su POWER 6/7 di IBM e SilMinds scheda di accelerazione basata su PCIe SilAx

SilMinds ha pubblicato un case study sulla conversione dell'esecuzione aritmetica decimale per utilizzare Soluzioni HW . Un grande impulso nel tempo e un consumo di energia ridotto.

Inoltre diverse pubblicazioni di "Michael J. Schulte" e altri rivelano risultati di benchmark molto positivi e alcuni confronti tra i formati DPD e BID (entrambi definiti nello standard IEEE 754-2008)

Puoi trovare i pdf in:

  1. Analisi delle prestazioni di librerie decimali in virgola mobile e relativo impatto su soluzioni hardware e software decimali

  2. Un sondaggio sui progetti hardware per l'aritmetica decimale

  3. Miglioramento dell'energia e dei ritardi tramite unità decimali in virgola mobile

Questi 3 documenti dovrebbero essere più che sufficienti per le tue domande!

Suppongo che non ci siano applicazioni a calcolo intensivo di numeri decimali. D'altra parte, il numero in virgola mobile è ampiamente utilizzato nelle applicazioni di ingegneria, che devono gestire enormi quantità di dati e non necessitano di risultati esatti, devono solo rimanere nella precisione desiderata.

I decimali (e più in generale le frazioni) sono relativamente facili da implementare come coppia di numeri interi. Le librerie per scopi generici sono onnipresenti e facilmente abbastanza veloci per la maggior parte delle applicazioni.

Chiunque abbia bisogno del massimo della velocità, perfezionerà la propria implementazione (ad es. cambiando il divisore per adattarlo a un particolare utilizzo, combinando / riordinando algebricamente le operazioni, un uso intelligente dei riquadri SIMD ...). La semplice codifica delle funzioni più comuni in un ISA hardware sicuramente non le soddisferebbe mai - con ogni probabilità, non sarebbe affatto utile.

La semplice risposta è che i computer sono macchine binarie. Non hanno dieci dita, ne hanno due. Quindi la costruzione di hardware per numeri binari è considerevolmente più veloce, più semplice ed efficiente rispetto alla creazione di hardware per numeri decimali.

A proposito: decimale e binario sono basi numeriche, mentre il punto fisso e il virgola mobile sono meccanismi per l'approssimazione di numeri razionali. I due sono completamente ortogonali: puoi avere numeri decimali in virgola mobile (System.Decimal di .NET è implementato in questo modo) e numeri binari in virgola fissa (i numeri interi normali sono solo un caso speciale di questo).

La matematica in virgola mobile è essenzialmente un tentativo di implementare decimali nell'hardware. È problematico, motivo per cui i tipi decimali vengono creati in parte nel software. È una buona domanda, perché le CPU non supportano più tipi, ma suppongo che risale ai processori CISC vs RISC: RISC ha vinto la battaglia delle prestazioni, quindi credo che al giorno d'oggi le cose siano semplici.

I computer moderni sono generalmente di uso generale. L'aritmetica in virgola mobile è uno scopo molto generale, mentre Decimal ha uno scopo molto più specifico. Penso che sia parte del motivo.

Intendi i tipici tipi integrali numerici "int", "long", "short" (eccetera.)? Perché le operazioni su questi tipi sono sicuramente implementate nell'hardware. Se stai parlando di numeri grandi di precisione arbitraria ("BigNums" e "Decimali" e simili), è probabilmente una combinazione di rarità di operazioni che utilizzano questi tipi di dati e la complessità della costruzione di hardware per gestire formati di dati arbitrariamente grandi .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top