Här så kommer A vara heltal, 0..255 och då passar uint8_t riktigt bra. Men att minimera denna ekvation ovan kräver en hel del beräkningar. Jag kan göra detta i flyttal, men jag vet inte hur snabbare det blir om jag gör det i heltal. Jag har sökt lite på internet och jag får alltid svaret "Det beror på...".
Så om "Beror på" är inbyggda ARM system då? Hur snabbare är då heltal jämfört med flyttal?
Heltal är per natur oerhört mycket snabbare än flyttal, även om man har FPU.
Dock så vilken ordlängd man skall använda beror på arkitektur.
Oftast är heltalen snabbare om man använder nativ ordlängd, dvs för en 32-bitars processor, så är det oftast lämpligare att använda 32-bitars heltal jämfört med 8-bitars.
Vilken ARM processor?
Hur frekvent MÅSTE du lösa/optimera systemet?
Hur robust måste lösningen vara för dåligt konditionerade matriser etc.?
Ofta stöter man på patrull hur man ska hantera avrundningar korrekt för att inte addera systematiskt brus/fel till optimeringen. Många sådana problem "löser sig självt" när man jobbar med flyttal direkt på fpu.
och slutligen, hur stor systemmatris har du? är den konstant eller kommer dimensionen variera?
Med en äldre ARM-processor som beräknar flyttalen i mjukvara så är skillnaden enorm.
Med senare varianter som har fpu, och med kompileringsflaggorna rätt satta, så år skillnaden marginell.
Men troligen är ändå heltal lite snabbare.
Det bästa är att skriva testexempel och jämföra.
Programmeringsarbetet kanske är svårare och mer omfattande med heltal, beroende på om enkla lösningar fungerar eller inte.
Så mitt grundtips blir: använd flyttal om det finns en fpu, annars absolut inte.
mounte skrev: ↑31 maj 2021, 18:00:32
Vilken ARM processor?
Hur frekvent MÅSTE du lösa/optimera systemet?
Hur robust måste lösningen vara för dåligt konditionerade matriser etc.?
Ofta stöter man på patrull hur man ska hantera avrundningar korrekt för att inte addera systematiskt brus/fel till optimeringen. Många sådana problem "löser sig självt" när man jobbar med flyttal direkt på fpu.
och slutligen, hur stor systemmatris har du? är den konstant eller kommer dimensionen variera?
Låt oss säga. 32*32 = 1024 på höjden A. Sedan 200 på bredden Så 1.024*200 = 204.8 kB i flash blir det för A matrisen. Element uint8_t.
I detta fall så ska vektor \(x\) vara gles, dvs den ska bara innehålla 0:or och vissa tal. Så jag har ringa intresse om lösningen kommer vara bra eller inte. Det viktigaste är att det blir massa 0:or i vektorn samt vissa tal som "sticker uppåt".
Matrisen A är konstant. Den är dessutom kvadratisk innan beräkningen.
SvenW skrev: ↑31 maj 2021, 18:02:05
Helt rätt, 'det beror på..'
Med en äldre ARM-processor som beräknar flyttalen i mjukvara så är skillnaden enorm.
Med senare varianter som har fpu, och med kompileringsflaggorna rätt satta, så år skillnaden marginell.
Men troligen är ändå heltal lite snabbare.
Det bästa är att skriva testexempel och jämföra.
Programmeringsarbetet kanske är svårare och mer omfattande med heltal, beroende på om enkla lösningar fungerar eller inte.
Så mitt grundtips blir: använd flyttal om det finns en fpu, annars absolut inte.
Jag har FPU. Men bara för float, inte double. Men jag kör bara float.
Sedan finns ju möjligheten med vektoriserade heltal och även flyttal på en del CPU:er. Med lite template-iserad C++ matriskod borde du kunna göra ett enkelt test.
DanielM skrev: ↑31 maj 2021, 17:55:19
Det finns väll ingen som har mätt upp hur snabbt det är?
Känns som att denna tråd kommer bli en lång tråd.
Har mätt hastigheten med olika stora UINTar, på en MIPS. Där visade det sig att 32 bitars var snabbast, alternativt 16 bitars om man kompilerade med 16-bitars option.
DanielM skrev: ↑31 maj 2021, 17:55:19
Det finns väll ingen som har mätt upp hur snabbt det är?
Känns som att denna tråd kommer bli en lång tråd.
Har mätt hastigheten med olika stora UINTar, på en MIPS. Där visade det sig att 32 bitars var snabbast, alternativt 16 bitars om man kompilerade med 16-bitars option.