E 'possibile aumentare la precisione di aritmetica in virgola mobile con gcc?
-
04-10-2019 - |
Domanda
qualche programma in C che fa ampi calcoli in virgola mobile ottengono risultati retto su una macchina Linux pc, ma risultati errati sulla SPE del processore cellulare, ma non sul PPU della cella. Sto usando i compilatori gcc. Mi chiedo se c'è qualche opzione di compilazione gcc per aumentare metodo di arrotondamento o simili in modo da ottenere singoli calcoli galleggiante di precisione con più precisione. Non posso cambiare per raddoppiare, come sulle prestazioni SPE sarebbe drastica riduzione
Grazie
Soluzione
In base alla IBM documentazione per le differenze da IEEE 754 sul SPU , potrebbe essere qualsiasi numero di cose:
- Zero risultati di operazioni aritmetiche sono sempre +0, mai -0.
- ingressi denormal da 2-149 a 2-126 per operazioni aritmetiche vengono trattate come zero con lo stesso segno. Aritmetica operazioni producono mai denormal risultati, ma producono +0, invece.
- Le operazioni aritmetiche non supportano IEEE Inf o NaN. Queste sequenze di bit rappresentare i numeri validi. straripamento risultati producono la massima grandezza valore del segno appropriato.
- operazioni aritmetiche utilizzare solo il round-a-zero (chop, troncamento) modalità di arrotondamento, indipendentemente dal impostazione della modalità di arrotondamento nella Floating-Point di stato e di controllo Register (FPSCR), che riguarda solo l'aritmetica a doppia precisione operazioni.
Naturalmente, in una pagina correlata, è possibile codificare SPU anche compilazione di una rigorosa IEEE conformità :
Per impostazione predefinita, XL C / C ++ segue la maggior parte, ma Non tutte le regole della IEEE standard. Se si compila con la opzione -qnostrict, che viene attivata per impostazione predefinita a livello di ottimizzazione -O3 o regole superiore, alcune IEEE in virgola mobile sono violati in modi che possono migliorare prestazioni, ma potrebbe influenzare programma correttezza. Per evitare questo problema, e per la compilazione di un rigoroso rispetto lo standard IEEE, procedere come segue:
- Utilizzare i = -qfloat opzione del compilatore nomaf.
- Se il programma cambia la modalità di arrotondamento in fase di esecuzione, utilizzare il -qfloat = RRM opzione.
- Se il codice di dati o di programma contiene la segnalazione valori NaN (NANS), utilizzare il -qfloat = nans opzione. (A segnalazione NaN è diverso da una tranquilla NaN; voi deve codificare in modo esplicito nella programma o di dati o crearlo utilizzando l'opzione -qinitauto compilatore.)
- Se si compila con -O3, -O4 o -O5, includere l'opzione -qstrict dopo di esso.