Matrisberäkningar med för STM32?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
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 »

cut.c suger mycket tid och ett förslag från mig är att göra så att man kan börja vid korrekt rad och korrekt kolumn.

Nu måste jag sova, men för er övriga så kan jag säga att denna tanke är ungefär rätt. Nackdelen är att indexeringen är inte helt synkad. Har ni andra förslag så säg bara till.

Teorin bakom cut är att man ska kunna skära av en t.ex. 5x5 matris till 2x2 matris - linjärt.

Kod: Markera allt

matrix* cut(matrix* a, int start_n, int stop_n, int start_m, int stop_m) {

	// Create the output
	matrix* out = initMatrix(stop_n - start_n+1, stop_m - start_m+1);
	float* ptr = out->data;

	float* data = a->data;


	float empty = 0; // This variable works only so we can bypass the values from data that we don't want
	for (int i = start_n; i < stop_n; i++) {
		for (int j = start_m; j < stop_m; j++) {


			*(ptr++) = *((data + i*stop_n) + j); // In med denna

			/* Bort med denna kod
   
			// if i is equal to the row element and the same as for j with columns
			if (i >= start_n && i <= stop_n && j >= start_m && j <= stop_m) {
				*(ptr++) = *(data++); // add
			} else {
				empty = *(data++);
			}
*/

		}
	}
	empty = empty*0; // This will remove the warning "variable not used"

	return out;
}
Användarvisningsbild
papabear
Inlägg: 821
Blev medlem: 14 mars 2004, 03:27:12
Ort: Eskilstuna
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av papabear »

Jag är absolut inte bra på c, men jag tycker det ser lite lustigt ut med empty.
Kan du inte bara i else köra data++, och ta bort allt med empty?
Vad ska "empty = *(data++)" göra?
Användarvisningsbild
AndLi
Inlägg: 17119
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av AndLi »

data++; ska göra exakt samma sak eftersom empty ändå inte används...
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 908
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Matrisberäkningar med för STM32?

Inlägg av mankan »

Några saker i koden som jag lagt märke till:
  • pow(<konstant uttryck>) beräknas många gånger inuti loopar, kanske kompilatorn optimerar bort det men det bör räcka med en gång per funktion eller tom deklarera en global konstant.

    absm (eller vad filen heter) använder heltalsfunktionen abs och inte fabs. Jag tror inte du vill ha avrundning här.

    Enligt profileringsdatat så läcker det minne. Du har 7 färre anrop till freeMatrix än initMatrix.

    Fundera på om initMatrix verkligen ska nolla matrisen. Det kanske är helt onödigt många gånger.
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 »

>> Enligt profileringsdatat så läcker det minne. Du har 7 färre anrop till freeMatrix än initMatrix.

Okej! Då har jag glömt att radera några matriser i min funktion. Om ni undrar VARFÖR jag har valt att koda så här så har detta med:

1. Jag använder 2D matriser i form av strukturer och pekare
2. Jag vill att biblioteket ska vara så lik MATLAB som möjligt. Detta är det viktigaste för man vill ofta konvertera om MATLAB kod till C-kod. I Armadillo C++ så kan man detta, men det är ett stort bibliotek för C++. Nu är min STM32 för C.

Det är bra att nolla matisen. Detta sker nu idag med memset.
Senast redigerad av Al_Bundy 23 januari 2019, 11:33:39, redigerad totalt 1 gång.
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 »

AndLi skrev:data++; ska göra exakt samma sak eftersom empty ändå inte används...
Jag fick en varning om jag inte använde empty.
Användarvisningsbild
AndLi
Inlägg: 17119
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av AndLi »

Ja, fast det var inte den raden jag ifrågasatte utan empty = *(data++); den går att ersätta med data++;
Och då kan du ta bort empty helt och hållet eftersom du precis som kompilatorn påpekar inte använder den till något vettigt.
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 »

Tack för tipset! Jag ska åtgärda detta! :)
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 »

mankan skrev:Och i cut kan man köra radvis memcpy på de rader man vill ha istället för att loopa över alla element i källmatrisen.
Hur menar du?
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 908
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Matrisberäkningar med för STM32?

Inlägg av mankan »

Du kan ersätta innersta loopen med memcpy då man både läser och skriver i adressordning i loopen.
hummel
Inlägg: 2268
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Matrisberäkningar med för STM32?

Inlägg av hummel »

Al_Bundy skrev:Fast jag gör det mer i svd.c och svd.c går snabbare än qr.c

Orsaken varför jag har valt detta har med att biblioteket ska vara så MATLAB-likt som möjligt.
Jag vet inte vad du menar med profilera koden. Jag vet inte vad du menar med stack, men jag har för mig att det har med lite mer med minneshantering typ som kö och lista.
Tror det är problemets kärna här. Vill man inte eller kan man inte sätta sig in dessa delar är det enklaste lösningen att skaffa snabbare processor och mer minne så KAN det fungera ändå. Snabbaste lösningen är självklart att man löser det med aktuell hårdvara.
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 »

mankan skrev:Du kan ersätta innersta loopen med memcpy då man både läser och skriver i adressordning i loopen.
Jag tror det inte skulle fungera. I så fall får du visa mig. Annars så har jag reducerat tiden från 1.87 sekunder till 0.21 sekunder igenom denna.

Kod: Markera allt

matrix* cut(matrix* a, int start_n, int stop_n, int start_m, int stop_m) {

	int n = a->row;
	float* data = a->data;

	// Create the output
	matrix* out = initMatrix(stop_n - start_n+1, stop_m - start_m+1);
	float* ptr = out->data;

	for (int i = start_n; i < stop_n+1; i++) {
		for (int j = start_m; j < stop_m+1; j++) {
			*(ptr++) = *((data + i*n) + j);
		}
	}

	return out;
}
Hur var det man gjorde profilering i C hos Eclipse?
bearing
Inlägg: 11253
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Matrisberäkningar med för STM32?

Inlägg av bearing »

Tänker mig något liknande detta.

Kod: Markera allt

//Innan loopen:
data = data + start_n * n + start_m;

...

//Och sedan i loopen:
memcpy(ptr, data, out_m);
data = data + in_m;
ptr = ptr + out_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 »

Al_Bundy skrev:Hur var det man gjorde profilering i C hos Eclipse?
Kompilera med -pg
Kör programmet
Kör gprof
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 »

bearing skrev:Tänker mig något liknande detta.

Kod: Markera allt

//Innan loopen:
data = data + start_n * n + start_m;

...

//Och sedan i loopen:
memcpy(ptr, data, out_m);
data = data + in_m;
ptr = ptr + out_m;
Men då är det ju loop iallafall. Jag förstår inte riktigt hur denna kan vara effektivare än någon enkel for-loop som itererar mindre nu.
Skriv svar