Matrisberäkningar med för STM32?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: Matrisberäkningar med för STM32?

Inlägg av ahlsten »

Ursäkta om jag var otydlig, med de menade jag inte Al_Bundy utan de som undrade om han även kompilerat med -Wall.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Matrisberäkningar med för STM32?

Inlägg av snigelen »

Ok. (Det var snarare jag som läste slarvigt).
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

ahlsten skrev:Jag skulle gissa att de inte testat att kompilera projektet. De försöker bara visa hur du kan slå på ficklampan för att se hur det egentligen ligger till med koden, C är ett väldigt flexibelt språk så C-kompilatorer har en tradition av att släppa igenom allt som är grammatiskt korrekt utan ett knyst om man inte slår på olika nivåer av syftningsfelsvarningar. Det går utmärkt att använda en tilldelning istället för ett likheltstest i en if-sats eftersom det ibland är efterfrågansvärt men -Wall i gcc varnar för sånt. Sen är det såklart inte alls säkert att det finns ett enda sådant eller liknande fel i ditt projekt men det är förhoppningsvis av välvilja som de envisas med dig.

Tillägg: Nu använder du Eclipse, och lite beroende på vilket paket du använder för att koda C så varnar det ju redan när man redigerar koden för många sådana tankevurpor.
Japp! Eclipse skriker till direkt vid minsta lilla fel.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

snigelen skrev:> Jag skulle gissa att de inte testat att kompilera projektet.

Varför gissa det? Han säger ju att han kompilerar utan fel. Brukar du skriva 2000+ rader kod utan att kompilera?

Jag kan bekräfta att Al's kod går utmärkt att kompilera, utan varningar (med -Wall). (Bara man fixar det triviala skrivfelet i freeMatrix. (byt m = NULL till a = NULL).
Orsaken varför det blev så har med att freeMatrix.c hade argumentet matrix* m, medan alla andra .c filer har argumentet matrix* a. Därför gjorde jag en liten manuell redigering, men missade att m ska vara a.

:)

Jag lägger upp den korrigerade versionen

Det skulle vara ganska kul om något testade biblioteket för att kolla efter om buggar finns. Skulle vara uppskattat :)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Matrisberäkningar med för STM32?

Inlägg av Mr Andersson »

Jag blir alltid lika förvirrad när jag läser den här tråden. Först ber du om synpunkter, sen när du får det viftar du bort dem som avundsjuka.

Koden fungerar. Bra organisering och kommentering. Bra jobbat. :tumupp:
Du överanvänder malloc/free och kopieringar. Man skulle kunna ta bort minst 50% av dem. T.ex.

Kod: Markera allt

// Reset the minor matrix and jump back to cell position 0
t = zeros(n-1, n-1);
copyval(t, minor);
freeMatrix(t);
Du allokerar en ny matris, sätter varje element till 0, kopierar matrisen, och tar bort temporären. Istället för att bara använda memset direkt på minor.

Det finns många fler ställen där du använder heap-minne för temporärer där stack-minne skulle passa bättre.
Du verkar inte ha koll på att malloc kan misslyckas. Du kollar aldrig returvärdet.
Senast redigerad av Mr Andersson 22 januari 2019, 13:06:14, redigerad totalt 1 gång.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av sodjan »

Märklig diskussion...

Al fick ett förslag om att även kompilera med flaggan "-Wall". Inget dumt förslag som sådant (eller?).
Al svarade med att han inte vet hur han gör det, även fast han redan har lagt till flaggan "-lm".
Om Al hade svarat med att han inte tyckte att "-Wall" behövdes så hade det varit en annan sak...

> Jag kan bekräfta att Al's kod går utmärkt att kompilera, utan varningar (med -Wall).

Nej, det gjorde det ju inte, vilket du även själv skrev inom parentes...
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Mr Andersson skrev:Jag blir alltid lika förvirrad när jag läser den här tråden. Först ber du om synpunkter, sen när du får det viftar du bort dem som avundsjuka.

Koden fungerar. Bra organisering och kommentering. Bra jobbat. :tumupp:
Du överanvänder malloc/free och kopieringar. Man skulle kunna ta bort minst 50% av dem. T.ex.

Kod: Markera allt

// Reset the minor matrix and jump back to cell position 0
t = zeros(n-1, n-1);
copyval(t, minor);
freeMatrix(t);
Du allokerar en ny matris, sätter varje element till 0, kopierar matrisen, och tar bort temporären. Istället för att bara använda memset direkt på minor.

Det finns många fler ställen där du använder heap-minne för temporärer där stack-minne skulle passa bättre.
Du verkar inte ha koll på att malloc kan misslyckas. Du kollar aldrig returvärdet.
Hur skulle jag kunna använda memset för att kopiera värderna? Jag gör det i själva initMatrix.c filen. Men då kompierar jag just själva "0.0".

Kod: Markera allt

memset(out->data, 0.0, column * row * sizeof(float));
Detta betyder att jag sätter in 0.0 i alla celler som begynnelsevärde. Du menar att om jag vill kopiera så borde jag göra detta.

Kod: Markera allt

memset(minor->data, 0.0 , column * row * sizeof(float));
Tack! Jag ska finslipa på biblioteket! :) Men undra hur det blir om jag använder memset för att kopiera olika värden då?
memset(b->data, a->data , column * row * sizeof(float));
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Matrisberäkningar med för STM32?

Inlägg av Mr Andersson »

memset sätter hela området till samma värde. Målet var ju att nolla matrisen.
memcpy kopierar.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Jag testade med memcpy, men jag måste ha strulat till det, för jag kopierade även adressen, vilket jag inte ville göra. Endast värdet.

Så jag programmerade bara rakt av, och där efter ska jag optimera koden.
Användarvisningsbild
Icecap
Inlägg: 26151
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Matrisberäkningar med för STM32?

Inlägg av Icecap »

Nja... memset(Lokation, värde, antal_bytes) lägger inte in 0.0 (som i flyttal), den lägger in 0 i varje byte som anges. Att det då råkar passa med att slutvärdet blir 0.0 i float är väl rent tur.

Och det är nog ett litet långsam sätt sätt att göra det på kan jag tro.
Du använder en 32-bitars µC och att anropa en funktion som ställer en buffer BYTE-FÖR-BYTE till noll är långsammare än att göra det samma med 32 bitars värden.

Kod: Markera allt

void Clear_Buffer(void* Target, int Value, size_t Length)
  {
  int* Ptr;
  Length /= sizeof(int);
  while(Length)
    {
    *Target = 0;
    Length--;
    }
  }
Borde vara lite snabbare kan jag tänka mig - och kräva samma input parameter.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Skriv gärna upp era förslag på vad ni tycks kunna göras bättre. Att införa en clearMatrix(matrix* a) vore inte helt dumt. En sådan funktion med en rad kod av memset. Då kan man i praktiken återanvända matriser, istället för att radera och skapa nytt. Sparar många for-loopar här.

Sedan skulle man kicka lite mer på att ersätta copyval(matrix*a, matrix* b) med memcpy(b->data, a->data, storlek på någon av a eller b)

Zeros(int n, int m) kan ju ersättas med initMatrix(int n, int m).
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Matrisberäkningar med för STM32?

Inlägg av Mr Andersson »

Icecap skrev:Och det är nog ett litet långsam sätt sätt att göra det på kan jag tro.
Du använder en 32-bitars µC och att anropa en funktion som ställer en buffer BYTE-FÖR-BYTE till noll är långsammare än att göra det samma med 32 bitars värden.
Nej memset arbetar inte bytevis. Den och memcpy och några fler är bland de hårdast optimerade funktionerna i standardbiblioteken just pga att de används så ofta.
Användarvisningsbild
Icecap
Inlägg: 26151
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Matrisberäkningar med för STM32?

Inlägg av Icecap »

Hmmmm, definitionen i C är just void *memset(void *str, int c, size_t n) och ja, det måste ju då passa att den stegar i steg om int.

Jag har alltid lärt den som att n är antalet bytes som ska sättas men det är i verkligheten antal int. Den får jag ta med mig inser jag.

Fast i beskrivningen ser jag:
Parameters
str − This is a pointer to the block of memory to fill.

c − This is the value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.

n − This is the number of bytes to be set to the value.
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Matrisberäkningar med för STM32?

Inlägg av Mr Andersson »

Jo det stämmer att det är antal bytes. Värdeargumentet är int men det är bara den lägsta byten som används. memset(..., 0xffffff00, ...) sätter hela området till 0.
Det betyder dock inte att memset jobbar med bytes internt. Se t.ex. https://android.googlesource.com/platfo ... c/memset.S
Den väljer olika algoritmer beroende på längd och alignment på minnet då olika metoder skalar olika. Men den kommer använda 32-bitars skrivningar så ofta som det går.

Det går att göra speciallösningar som är effektivare om man t.ex. kan garantera att längden alltid är samma, men att göra en generisk funktion som är snabbare är väldigt svårt.
hummel
Inlägg: 2269
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Matrisberäkningar med för STM32?

Inlägg av hummel »

Al, har du ditt testprojekt tillgängligt för nedladdning så jag kan testa det i Eclipse?
Skriv svar