Sida 24 av 70

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 03:10:44
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;
}

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 09:48:51
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?

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 10:19:58
av AndLi
data++; ska göra exakt samma sak eftersom empty ändå inte används...

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 10:52:16
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.

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 11:20:19
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.

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 11:21:13
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.

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 11:23:46
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.

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 11:34:19
av Al_Bundy
Tack för tipset! Jag ska åtgärda detta! :)

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 12:39:07
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?

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 13:00:46
av mankan
Du kan ersätta innersta loopen med memcpy då man både läser och skriver i adressordning i loopen.

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 14:14:21
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.

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 18:55:30
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?

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 20:04:12
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;

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 20:18:52
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

Re: Matrisberäkningar med för STM32?

Postat: 23 januari 2019, 20:32:23
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.