Subnormalt antal
Inom datavetenskap är subnormala tal delmängden av denormaliserade tal (ibland kallade denormaler ) som fyller underflödesgapet runt noll i flyttalsaritmetik . Alla tal som inte är noll med en magnitud som är mindre än det minsta normaltalet är subnormalt .
- Användningsnotering: i vissa äldre dokument (särskilt standarddokument som de första utgåvorna av IEEE 754 och C-språket ) används "denormal" för att uteslutande referera till subnormala tal. Denna användning kvarstår i olika standarddokument, särskilt när man diskuterar hårdvara som inte kan representera några andra denormaliserade tal, men diskussionen här använder termen subnormal i linje med 2008 års revision av IEEE 754 .
I ett normalt flyttalsvärde finns det inga inledande nollor i signifikansen ( mantissa ); snarare tas inledande nollor bort genom att justera exponenten (till exempel skulle talet 0,0123 skrivas som 1,23 × 10 −2 ). Omvänt har ett denormaliserat flyttalsvärde en signifikans med en inledande siffra på noll. Av dessa representerar de subnormala talen värden som om de normaliserades skulle ha exponenter under den minsta representativa exponenten (exponenten har ett begränsat intervall).
00 Signifikansen (eller mantissan) för ett IEEE-flyttal är den del av ett flyttal som representerar de signifikanta siffrorna . För ett positivt normaliserat tal kan det representeras som m . m 1 m 2 m 3 ... m p −2 m p −1 (där m representerar en signifikant siffra och p är precisionen) med icke-noll m . Observera att för en binär radix är den ledande binära siffran alltid 1. I ett subnormalt tal, eftersom exponenten är den minsta den kan vara, är noll den ledande signifikanta siffran (0. m 1 m 2 m 3 ... m p −2 m p −1 ), vilket tillåter representation av tal närmare noll än det minsta normaltalet. Ett flyttal kan identifieras som subnormalt när dess exponent är det minsta möjliga värdet.
Genom att fylla underflödesgapet så här förloras signifikanta siffror, men inte lika abrupt som när man använder spolningen till noll vid underflödesmetod (alla betydande siffror kasseras när underflödet uppnås). Därför kallas produktionen av ett subnormalt tal ibland gradvis underflöde eftersom det tillåter en beräkning att långsamt förlora precision när resultatet är litet.
I IEEE 754-2008 döps denormala tal om till subnormala tal och stöds i både binära och decimala format. I binära utbytesformat kodas subnormala tal med en partisk exponent på 0, men tolkas med värdet av den minsta tillåtna exponenten, som är en större (dvs som om den var kodad som en 1). I decimalutbytesformat kräver de ingen speciell kodning eftersom formatet stöder onormaliserade tal direkt.
Matematiskt sett är de normaliserade flyttalstalen för ett givet tecken grovt logaritmiskt fördelade, och som sådan kan varje ändlig storlek normalt flytande inte inkludera noll . De subnormala flöten är en linjärt fördelad uppsättning värden, som spänner över gapet mellan de negativa och positiva normala flöten.
Flyttalsformat 754 |
---|
IEEE |
|
Övrig |
Bakgrund
Subnormala tal ger garantin att addition och subtraktion av flyttalstal aldrig underskrider; två närliggande flyttal har alltid en representativ skillnad som inte är noll. Utan gradvis underflöde kan subtraktionen a − b rinna under och ge noll trots att värdena inte är lika. Detta kan i sin tur leda till division med noll fel som inte kan uppstå när gradvis underflöde används.
Subnormala tal implementerades i Intel 8087 medan IEEE 754-standarden skrevs. De var den överlägset mest kontroversiella egenskapen i KCS-format som så småningom antogs, men denna implementering visade att subnormala tal kunde stödjas i en praktisk implementering. Vissa implementeringar av flyttalsenheter stöder inte direkt subnormala siffror i hårdvara, utan fäller snarare till någon form av mjukvarustöd. Även om detta kan vara transparent för användaren, kan det resultera i att beräkningar som producerar eller konsumerar subnormala tal blir mycket långsammare än liknande beräkningar på normala tal.
Prestandaproblem
Vissa system hanterar undernormala värden i hårdvara, på samma sätt som normala värden. Andra lämnar hanteringen av subnormala värden till systemprogramvara ("assist"), hanterar endast normala värden och noll i hårdvara. Hantering av subnormala värden i mjukvara leder alltid till en signifikant minskning av prestanda. När subnormala värden helt och hållet beräknas i hårdvara, finns implementeringstekniker för att tillåta deras bearbetning med hastigheter jämförbara med normala tal. Beräkningshastigheten är dock fortfarande avsevärt reducerad på många moderna x86-processorer; i extrema fall instruktioner som involverar subnormala operander ta så många som 100 extra klockcykler, vilket gör att de snabbaste instruktionerna går så mycket som sex gånger långsammare.
Denna hastighetsskillnad kan vara en säkerhetsrisk. Forskare visade att det tillhandahåller en sidokanal för timing som gör att en skadlig webbplats kan extrahera sidinnehåll från en annan webbplats i en webbläsare.
Vissa applikationer måste innehålla kod för att undvika subnormala siffror, antingen för att bibehålla noggrannhet eller för att undvika prestandastraff i vissa processorer. Till exempel i ljudbehandlingstillämpningar representerar subnormala värden vanligtvis en signal som är så tyst att den ligger utanför det mänskliga hörselområdet. På grund av detta är en vanlig åtgärd för att undvika subnormala förhållanden på processorer där det skulle finnas en prestandastraff att sänka signalen till noll när den når subnormala nivåer eller blanda in en extremt tyst brussignal. Andra metoder för att förhindra subnormala tal inkluderar att lägga till en DC-offset, kvantisera tal, lägga till en Nyquist-signal, etc. Sedan SSE2 -processorförlängningen har Intel tillhandahållit en sådan funktionalitet i CPU-hårdvara, som avrundar subnormala tal till noll.
Inaktiverar subnormala flytningar på kodnivå
Intel SSE
Intels C- och Fortran-kompilatorer aktiverar flaggorna DAZ
(denormals-are-zero) och FTZ
(flush-to-zero) för SSE som standard för optimeringsnivåer högre än -O0
. Effekten av DAZ
är att behandla subnormala inmatningsargument till flyttalsoperationer som noll, och effekten av FTZ
är att returnera noll istället för ett subnormalt flytande för operationer som skulle resultera i ett subnormalt flytande, även om ingångsargumenten inte är dem själva subnormal. clang och gcc har olika standardtillstånd beroende på plattform och optimeringsnivå.
En metod som inte är C99 -kompatibel för att aktivera DAZ-
och FTZ
-flaggor på mål som stöder SSE ges nedan, men stöds inte brett. Det är känt att fungera på Mac OS X sedan åtminstone 2006.
#include <fenv.h> #pragma STDC FENV_ACCESS ON // Ställer in DAZ och FTZ, klipper andra CSR-inställningar. // Se https://opensource.apple.com/source/Libm/Libm-287.1/Source/Intel/, fenv.c och fenv.h. fesetenv ( FE_DFL_DISABLE_SSE_DENORMS_ENV ); // fesetenv(FE_DFL_ENV) // Inaktivera båda och klipp andra CSR-inställningar.
För andra x86-SSE-plattformar där C-biblioteket ännu inte har implementerat denna flagga, kan följande fungera:
#include <xmmintrin.h> _mm_setcsr ( _mm_getcsr () | 0x0040 ); // DAZ _mm_setcsr ( _mm_getcsr () | 0x8000 ); // FTZ _mm_setcsr ( _mm_getcsr () | 0x8040 ); // Båda _mm_setcsr ( _mm_getcsr () & ~ 0x8040 ); // Inaktivera båda
Makron _MM_SET_DENORMALS_ZERO_MODE
och _MM_SET_FLUSH_ZERO_MODE
omsluter ett mer läsbart gränssnitt för koden ovan.
// För att aktivera DAZ #inkludera <pmmintrin.h> _MM_SET_DENORMALS_ZERO_MODE ( _MM_DENORMALS_ZERO_ON ); // För att aktivera FTZ #inkludera <xmmintrin.h> _MM_SET_FLUSH_ZERO_MODE ( _MM_FLUSH_ZERO_ON );
De flesta kompilatorer tillhandahåller redan det föregående makrot som standard, annars kan följande kodavsnitt användas (definitionen för FTZ är analog):
#define _MM_DENORMALS_ZERO_MASK 0x0040 #define _MM_DENORMALS_ZERO_ON 0x0040 #define _MM_DENORMALS_ZERO_OFF 0x0000 #define _MM_SET_DENORMALS_ZERO_MODE(mode) _mm_mm_setcsrc(mode) _mm_mm_setcsr(DEN_MM_Setcsrc) (läge)) #define _MM_GET_DENORMALS_ZERO_MODE() (_mm_getcsr() & _MM_DENORMALS_ZERO_MASK)
Det förinställda denormaliseringsbeteendet är mandat av ABI , och därför bör väluppfostrad programvara spara och återställa denormaliseringsläget innan de återgår till den som ringer eller ringer upp koden i andra bibliotek.
ÄRM
AArch32 NEON (SIMD) FPU använder alltid ett flush-to-noll-läge, vilket är detsamma som FTZ + DAZ
. För skalär FPU och i AArch64 SIMD är flush-to-noll-beteendet valfritt och styrs av FZ
-biten i kontrollregistret – FPSCR i Arm32 och FPCR i AArch64.
Vissa ARM-processorer har hårdvaruhantering av subnormala.
Se även
Vidare läsning
- Eric Schwarz, Martin Schmookler och Son Dao Trong (juni 2003). "Hårdvaruimplementationer av denormaliserade siffror" (PDF) . Proceedings 16:e IEEE-symposiet om datoraritmetik (Arith16) . 16:e IEEE-symposiet om datoraritmetik . IEEE Computer Society . s. 104–111. ISBN 0-7695-1894-X . [ permanent död länk ]
- Se även olika artiklar på William Kahans webbplats [1] för exempel på var subnormala tal hjälper till att förbättra resultaten av beräkningar.