Unum (sifferformat)

Unums ( universella tal ) är en familj av format och aritmetik, som liknar flyttal , föreslog av John L. Gustafson 2015. De är designade som ett alternativ till den allestädes närvarande flyttalsstandarden IEEE 754 . Den senaste versionen (känd som posits) kan användas som en drop-in-ersättning för program som inte är beroende av specifika funktioner i IEEE 754.

Typ I Unum

Den första versionen av unums, formellt känd som Type I unum, introducerades i Gustafsons bok The End of Error som en superset av flyttalsformatet IEEE-754. De definierande egenskaperna hos Typ I unum-formatet är:

  • ett lagringsformat med variabel bredd för både signifikanden och exponenten och
  • en u-bit , som avgör om unum motsvarar ett exakt tal ( u = 0), eller ett intervall mellan på varandra följande exakta unum ( u = 1). På så sätt täcker unum hela den förlängda reella tallinjen [−∞,+∞].

För beräkning med formatet föreslog Gustafson att använda intervallaritmetik med ett par unum, vad han kallade en ubound , vilket gav garantin att det resulterande intervallet innehåller den exakta lösningen.

William M. Kahan och Gustafson debatterade unums på Arith23 -konferensen.

Typ II Unum

Typ II Unums introducerades 2016 som en omdesign av Unums som bröt IEEE-754-kompatibiliteten.

Position (Typ III Unum)

I februari 2017 introducerade Gustafson officiellt Typ III unums, posits för fasta flyttalsliknande värden och giltiga för intervallaritmetik . I mars 2021 ratificerades och publicerades en standard av Posit Working Group.

Positioner är en hårdvaruvänlig version av unum där svårigheter i den ursprungliga typ I unum på grund av dess varierande storlek är lösta. Jämfört med IEEE 754-floats av liknande storlek erbjuder posits ett större dynamiskt omfång och fler bråkbitar för värden med magnitud nära 1 (men färre bråkbitar för mycket stora eller mycket små värden), och Gustafson hävdar att de erbjuder bättre noggrannhet. I en oberoende studie bekräftade Lindstrom, Lloyd och Hittinger från Lawrence Livermore National Laboratory att antaganden överträffar flytningar i noggrannhet. [ tveksamt ] Positioner har överlägsen noggrannhet i området nära ett, där de flesta beräkningar sker. Detta gör det mycket attraktivt för den nuvarande trenden inom djupinlärning att minimera antalet bitar som används. Det hjälper potentiellt alla applikationer att accelerera genom att möjliggöra användningen av färre bitar (eftersom den har fler bråkdelar för noggrannhet) vilket minskar nätverks- och minnesbandbredd och effektkrav.

Formatet för en n -bitars posit får etiketten "posit" följt av decimalsiffrorna i n (t.ex. 16-bitars positformatet är "posit16") och består av fyra sekventiella fält:

  1. tecken : 1 bit, representerar ett heltal utan tecken s
  2. regim: minst 2 bitar och upp till ( n − 1), som representerar ett heltal utan tecken r enligt beskrivningen nedan
  3. exponent : upp till 2 bitar som tillgängliga efter regim, representerande ett heltal utan tecken e
  4. bråk : alla återstående bitar tillgängliga efter exponent, representerar en icke-negativ reell dyadisk rationell f mindre än 1

Regimfältet använder unär kodning av k identiska bitar, följt av en bit av motsatt värde om några kvarvarande bitar är tillgängliga, för att representera ett heltal utan tecken r som är − k om den första biten är 0 eller k − 1 om den första biten är 1. Tecken-, exponent- och bråkfälten är analoga med IEEE 754 tecken-, exponent- och signifikansfält (respektive), förutom att positexponent- och bråkfälten kan saknas eller trunkeras och implicit utökas med nollor – en frånvarande exponent behandlas som 00 2 (representerar 0), behandlas en enbitsexponent E 1 som E 1 0 2 (representerar heltal 0 om E 1 är 0 eller 2 om E 1 är 1), och en frånvarande fraktion behandlas som 0.

De två kodningarna där alla icke-teckenbitar är 0 har speciella tolkningar:

  • Om teckenbiten är 1 är positvärdet NaR ("inte en reell")
  • Om teckenbiten är 0 är positvärdet 0 (vilket är utan tecken och det enda värdet för vilket teckenfunktionen returnerar 0)

Annars är positvärdet lika med , där r skalar med potenser av 16, e skalar med potenser av 2, f fördelar värden enhetligt mellan intilliggande kombinationer av ( r , e ), och s justerar tecknet symmetriskt omkring 0.

Exempel

typ (posit n ) Binär Värde Anteckningar
några 1 0… NaR allt som inte matematiskt kan definieras som ett unikt reellt tal
några 0 0…
några 0 10…
några 1 10…
några 0 0 1 11 0…
några 0 0… 1 minsta positiva värde
några 0 1... största positiva värdet
posit8 0 000000 1 minsta positiva värde
posit8 0 1111111 största positiva värdet
posit16 0 0000000000000 1 minsta positiva värde
posit16 0 111111111111111 största positiva värdet
posit32 0 00000000000000000000000000000000 1 minsta positiva värde
posit32 0 11111111111111111111111111111111 största positiva värdet

Notera : 32-bitars posit förväntas vara tillräckligt för att lösa nästan alla klasser av applikationer [ citat behövs ] .

Quire

För varje posit n typ av precision definierar standarden en motsvarande "quire" typ quire n med precision som används för att ackumulera exakta summor av produkter av dessa positer utan avrundning eller översvämning i punktprodukter för vektorer på upp till 2 31 eller fler element (den exakta gränsen är . Qureformatet är ett med två komplement för tecken, tolkat som en multipel av enheter med storleken förutom specialvärdet med en inledande teckenbit på 1 och alla andra bitar lika med 0 (vilket representerar NaR ). Quires är baserade på verk av Ulrich W. Kulisch och Willard L. Miranker .

Giltig

Giltigheter beskrivs som ett typ III Unum-läge som gränsar resulterar i ett givet intervall.

Genomföranden

Flera mjukvaru- och hårdvarulösningar implementerar positurer. Den första kompletta parametriserade positaritmetiska hårdvarugeneratorn föreslogs 2018.

Unum implementeringar har utforskats i Julia och MATLAB . En C++- version med stöd för alla positstorlekar kombinerat med valfritt antal exponentbitar är tillgänglig. En snabb implementering i C, SoftPosit, tillhandahållen av NGA-forskningsteamet baserat på Berkeley SoftFloat kompletterar de tillgängliga programvaruimplementeringarna.

Projekt

författare

Typ Precisioner Quire

Stöd?

Fart Testning Anteckningar
GP-GPU

VividSparks

Världens första FPGA GP-GPU 32 Ja ~3,2 Tpops Uttömmande. Inga kända buggar. Racer GP-GPU har 512 kärnor
SoftPosit

EN STJÄRNA

C-bibliotek baserat på Berkeley SoftFloat

C++-omslag för att åsidosätta operatörernas Python-omslag med SWIG från SoftPosit

8, 16, 32 publicerade och kompletta; Ja ~60 till 110 Mpops/s på x86-kärna (Broadwell) 8: Uttömmande;

16: Uttömmande utom FMA, frågestund 32: Uttömmande test pågår fortfarande. Inga kända buggar.

Licens för öppen källkod. Det snabbaste och mest omfattande C-biblioteket för inlägg för närvarande. Designad för plugin-jämförelse av IEEE-floats och posits.
posit4.nb

EN STJÄRNA

Mathematica anteckningsbok Allt Ja < 80 kpops/s Uttömmande för låg precision. Inga kända buggar. Öppen källkod (MIT-licens). Originaldefinition och prototyp. Mest komplett miljö för att jämföra IEEE-floats och posits. Många exempel på användning, inklusive linjära lösare
posit-javascript

EN STJÄRNA

JavaScript-widget Konvertera decimal till posit 6, 8, 16, 32; generera tabellerna 2–17 med es 1–4. —; interaktiv widget Fullständigt testad Tabellgenerator och konvertering
Universell

Stillwater Supercomputing, Inc

C++ mallbibliotek

C-bibliotek Python-omslag Golang-bibliotek

Godtycklig precision posit float giltig (p)

Unum typ 1 (p) Unum typ 2 (p)

Godtyckliga behovskonfigurationer med programmerbar kapacitet posit<4,0> 1 GPOPS

posit<8,0> 130 MPOPS posit<16,1> 115 MPOPS posit<32,2> 105 MPOPS posit<64,3> 50 MPOPS posit<128,4> 1 MPOPS posit<256,5> 800 kPOPS

Komplett valideringssvit för godtyckliga positurer

Slumpmässiga för stora posit-konfigurationer. Använder induktion för att bevisa att nbits+1 är korrekt inga kända buggar

Öppen källa. MIT-licens.

Helt integrerad med C/C++-typer och automatiska konverteringar. Stöder fullständigt C++ matematikbibliotek (native och konvertering till/från IEEE). Körtidsintegrationer: MTL4/MTL5, Eigen, Trilinos, HPR-BLAS. Applikationsintegrationer: G+SMO, FDBB, FEniCS, ODEintV2, TVM.ai. Hardware Accelerator integration (Xilinx, Intel, Achronix).

Speedgo

Chung Shin Yee

Python bibliotek Allt Nej ~20 Mpops/s Omfattande; inga kända buggar Öppen källkod (MIT-licens)
softposit-rkt

David Thien

SoftPosit-bindningar för Racket Allt Ja Okänd Okänd
sfpy

Bill Zorn

SoftPosit-bindningar för Python Allt Ja ~20–45 Mpops/s på 4,9 GHz Skylake-kärna Okänd
positsoktav

Diego Coelho

Octave Implementation Allt Nej Okänd Begränsad testning; inga kända buggar GNU GPL
Sigmoidnummer

Isaac Yonemoto

Julia bibliotek Alla <32, alla ES Ja Okänd Inga kända buggar (posits).

Division buggar (giltiga)

Utnyttjar Julias mallade matematikstandardbibliotek, kan inbyggt göra matris- och tensoroperationer, komplexa tal, FFT, DiffEQ. Stöd för giltiga
FastSigmoid

Isaac Yonemoto

Julia och C/C++ bibliotek 8, 16, 32, alla ES Nej Okänd Känd bugg i 32-bitars multiplikation Används av LLNL i chockstudier
SoftPosit.jl

Milan Klöwer

Julia bibliotek Baserat på softposit;

8-bitars (es=0..2) 16-bitars (es=0..2) 24-bitars (es=1..2) 32-bitars (es=2)

Ja Liknande

A*STAR "SoftPosit" (Cerlane Leong)

Ja:

Posit (8,0), Posit (16,1), Posit (32,2) Andra format saknar full funktionalitet

Öppen källa. Problem och förslag på GitHub.

Detta projekt utvecklades på grund av att SigmoidNumbers och FastSigmoid av Isaac Yonemoto inte underhålls för närvarande.

Stöder grundläggande linjära algebrafunktioner i Julia (matrismultiplikation, matrislösning, Elgenupplösning, etc.)

PySigmoid

Ken Mercado

Python bibliotek Allt Ja < 20 Mpops/s Okänd Öppen källkod (MIT-licens). Lätt att använda gränssnitt. Exempel på nervnät. Stöd för omfattande funktioner.
cppPosit

Emanuele Ruffaldi

C++ bibliotek 4 till 64 (valfritt es-värde); "Mallversionen är 2 till 63 bitar" Nej Okänd Några grundläggande tester 4 nivåer av operationer som arbetar med posits. Speciellt stöd för NaN-typer (icke-standard)
bfp:Beyond Floating Point

Clément Guérin

C++ bibliotek Några Nej Okänd Buggar hittade; status för korrigeringar okänd Stöder + – × ÷ √ ömsesidigt, negera, jämföra
Verilog.jl

Isaac Yonemoto

Julia och Verilog 8, 16, 32, ES=0 Nej Okänd Omfattande testad för 8-bitars, inga kända buggar Endast avsedd för Deep Learning-applikationer Addition, Subtraktion och Multiplikation. En proof of concept-matrismultiplikator har byggts, men är off-spec i sin precision
Lombiq Aritmetik

Lombiq Technologies

C# med Hastlayer för hårdvarugenerering 8, 16, 32.

(64 bitar pågår)

Ja 10 Mpops/s

Klicka här för mer

Partiell Kräver Microsoft .Net API:er
Deepfloat Jeff Johnson, Facebook SystemVerilog Alla (parameteriserat SystemVerilog) Ja

(RTL för FPGA/ASIC-designer)

Begränsad Överensstämmer inte strikt med posit spec.

Stöder +,-,/,*. Implementerar både logaritmisk posit och normala, "linjära" positurer Licens: CC-BY-NC 4.0 för närvarande

Tokyo Tech FPGA 16, 32, utdragbar Nej "2 GHz", inte översatt till Mpops/s Partiell; kända avrundningsbuggar Ännu att vara öppen källkod
PACoGen: Posit Arthmetic Core Generator Manish Kumar Jaiswal Verilog HDL för Posit Arithmetic Vilken precision som helst.

Kan generera valfri kombination av ordstorlek (N) och exponentstorlek (ES)

Nej Designhastigheten är baserad på den underliggande hårdvaruplattformen (ASIC/FPGA) Uttömmande tester för 8-bitars posit.

Flera miljoner slumpmässiga tester utförs för upp till 32-bitars posit med olika ES-kombinationer

Den stöder avrundningsmetoden till närmaste avrundning.
Vinay Saxena, Research and Technology Centre, Robert Bosch, Indien (RTC-IN) och Farhad Merchant, RWTH Aachen University Verilog-generator för VLSI, FPGA Allt Nej Liknar flöten av samma bitstorlek N=8

- ES=2 | N=7,8,9,10,11,12 Selektiva (20000*65536) kombinationer för - ES=1 | N=16

För användning i kommersiella produkter. Som vi förstår det.

***Första någonsin integrering av posits i RISC-V***

Position Enabled RISC-V Core

(Sugandha Tiwari, Neel Gala, Chester Rebeiro, V.Kamakoti, IIT MADRAS)

Implementering av BSV (Bluespec System Verilog). 32-bitars posit med (es=2) och (es=3) Nej Verifierad mot SoftPosit för (es=2) och testad med flera applikationer för (es=2) och (es=3). Inga kända buggar. Första kompletta posit-kapabla RISC-V-kärna. Stöder dynamisk växling mellan (es=2) och (es=3).

Mer info här.

PERCIVAL

David Mallasén

Open-Source Posit RISC-V Core med Quire-kapacitet Position<32,2> med 512-bitars quire Ja Designhastigheten är baserad på den underliggande hårdvaruplattformen (ASIC/FPGA) Funktionstestning av varje positinstruktion. RISC-V-kärna med positiv kapacitet på applikationsnivå baserad på CVA6 som kan exekvera alla posit-instruktioner, inklusive quire-fused-operationerna. PERCIVAL är det första verket som integrerar hela posit ISA och quire i hårdvara. Det tillåter inbyggt exekvering av posit-instruktioner såväl som de vanliga flyttals-instruktionerna samtidigt.
LibPosit

Chris Lomont

En fil C# MIT Licensierad Vilken storlek som helst Nej Omfattande; inga kända buggar Ops: aritmetik, jämförelser, sqrt, sin, cos, tan, acos, asin, atan, pow, exp, log
unumjl

REX Computing

FPGA-version av "Neo" VLIW-processorn med posit numerisk enhet 32 Nej ~1,2 Gpop/s Omfattande; inga kända buggar Ingen delning eller kvadratrot. Första kompletta processordesign som ersätter flöten med posits.
PNU: Placera numerisk enhet

Calligo Tech

  • Octacore RISC-V med Posit as PNU implementerad på FPGA, demonstrerad i HiPC 2022.
  • ASIC-implementering av Octacore RISC-V + PNU förväntas i mitten av 2023.
  • <32, 2> med stöd för Quire 512 bitar.
  • <64, 3>
Ja - Fullt stöd. Benchmark pågår. Uttömmande tester genomförda för 32 bitar och 64 bitar med Quire-stöd slutförda. Helt integrerad med C/C++-typer och automatiska konverteringar. Stöder fullständigt C++ matematikbibliotek (native och konvertering till/från IEEE). Körtidsintegrationer: GNU Utils, OpenBLAS, CBLAS. Applikationsintegrationer: pågår. Kompilatorstöd utökat: C/C++, G++, GFortran & LLVM (pågår).
IBM-TACC

Jianyu Chen

FPGA för särskilda ändamål 32 Ja 16–64 Gpop/s Endast ett känt fall testades Gör 128-av-128 matris-matris multiplikation (SGEMM) med hjälp av quire.
Deep PeNSieve

Raul Murillo

Python-bibliotek (programvara) 8, 16, 32 Ja Okänd Okänd Ett DNN-ramverk som använder inlägg
Gosit

Jaap Aarts

Pure Go bibliotek 16/1 32/2 (ingår är en generisk 32/ES för ES<32) [ förtydligande behövs ] Nej 80 Mopp/s för div32/2 och liknande linjära funktioner. Mycket högre för trunkerat och mycket lägre för exp. Fuzzing mot c softposit med många iterationer för 16/1 och 32/2. Explicit testa edge-fall hittades. (MIT-licens) Implementeringarna där ES är konstant genereras koden. Generatorn ska kunna generera för alla storlekar {8,16,32} och ES under storleken. De som inte ingår i biblioteket som standard är dock inte testade, otydliga eller stöds. Använd gärna generatorn för att generera dem åt dig, rapportera buggar, tillhandahålla patchar etc. För vissa operationer på 32/ES är det möjligt att blanda och matcha ES. Detta är dock inte testat.

SoftPosit

SoftPosit är en mjukvaruimplementering av posits baserad på Berkeley SoftFloat. Det tillåter mjukvarujämförelse mellan posits och floats. Det stöder för närvarande

  • Lägg till
  • Subtrahera
  • Multiplicera
  • Dela upp
  • Fuserad-multiplicera-lägg till
  • Fused-dot-product (med quire)
  • Roten ur
  • Konvertera posit till heltal med och utan tecken
  • Konvertera heltal med och utan tecken till posit
  • Konvertera posit till en annan positstorlek
  • Mindre än, lika, mindre än lika jämförelse
  • Avrunda till närmaste heltal

Hjälparfunktioner

  • konvertera dubbel till posit
  • konvertera posit till dubbel
  • cast unsigned heltal till posit

Det fungerar för 16-bitars positer med en exponentbit och 8-bitars posit med noll exponentbit. Stöd för 32-bitars positioner och flexibel typ (2-32 bitar med två exponentbitar) väntar på validering. Den stöder x86_64-system. Den har testats på GNU gcc ( SUSE Linux ) 4.8.5 Apple LLVM version 9.1.0 (clang-902.0.39.2).

Exempel

Lägg till med posit8_t

 

     

       
      
      

       

    
       
     

    
       
     

     0
 #include  "softposit.h"  int  main  (  int  argc  ,  char  *  argv  []){  posit8_t  pA  ,  pB  ,  pZ  ;  pA  =  castP8  (  0xF2  );  pB  =  castP8  (  0x23  );  pZ  =  p8_add  (  pA  ,  pB  );  //Att kontrollera svaret genom att konvertera det till dubbel  dubbel  dZ  =  convertP8ToDouble  (  pZ  );  printf  (  "dZ: %.15f  \n  "  ,  dZ  );  //För att skriva ut resultat i binär (varning: icke-bärbar kod)  uint8_t  uiZ  =  castUI8  (  pZ  );  printBinary  ((  uint64_t  *  )  &  uiZ  ,  8  );  återvända  ;  } 

Fused dot-produkt med quire16_t


    
   
   
   

 


  


    
    


   


    //Konvertera dubbel till  posit16_t  pA  =  convertDoubleToP16  (  1.02783203125 )   ;  posit16_t  pB  =  convertDoubleToP16  (  0,987060546875  );  posit16_t  pC  =  convertDoubleToP16  (  0,4998779296875  );  posit16_t  pD  =  convertDoubleToP16  (  0,8797607421875  );  quire16_t  qZ  ;  //Sätt quire till 0  qZ  =  q16_clr  (  qZ  );  //ackumulera produkter utan avrundningar  qZ  =  q16_fdp_add  (  qZ  ,  pA  ,  pB  );  qZ  =  q16_fdp_add  (  qZ  ,  pC  ,  pD  );  //Konvertera tillbaka till  posit16_t  pZ  =  q16_to_p16  (  qZ  );  //För att kontrollera svara  dubbel  dZ  =  convertP16ToDouble  (  pZ  ); 

Kritik

William M. Kahan, huvudarkitekten för IEEE 754-1985 kritiserar typ I unums på följande grunder (vissa behandlas i typ II och typ III standarder):

  • Beskrivningen av unums kringgår med hjälp av kalkyl för att lösa fysikproblem.
  • Unums kan vara dyra i termer av tid och strömförbrukning.
  • Varje beräkning i unum-utrymme kommer sannolikt att ändra strukturens bitlängd. Detta kräver att de antingen packas upp i ett utrymme med fast storlek, eller dataallokering, deallokering och sophämtning under unum-operationer, liknande problem med att hantera poster med variabel längd i masslagring.
  • Unums ger bara två typer av numeriska undantag, tyst och signalerande NaN (Not-a-Number).
  • Unum-beräkning kan leverera alltför lösa gränser från valet av en algebraiskt korrekt men numeriskt instabil algoritm.
  • Fördelarna med unum framför kort precisionsflytpunkt för problem som kräver låg precision är inte uppenbara.
  • Att lösa differentialekvationer och utvärdera integraler med unum garanterar korrekta svar men är kanske inte lika snabba som metoder som vanligtvis fungerar.

Se även

Vidare läsning

externa länkar