Permalänk
Medlem
Skrivet av Zotamedu:

Jag har inte satt mig in så mycket djupare i lösningen men det jag fått höra av min handlerade, som jobbat i många år med den här typen av problem, är att det är fullt möjligt att ställa upp mitt problem som ett linjärt ekvationssystem och lösa det rakt av men att det inte är praktiskt när antalet celler blir stort.

Även om du itererar, eller framförallt då, vill du att varje iterationssteg ska få fort. Om du behöver lösa problemet 1 gång kan det ta lite mer tid, men behöver du lösa det 1000 gånger behöver du vara snabbare.

Det jag föreslår, och jag även tro att Mikael07 föreslår, är inte att du ska lösa ekvationssystem explicit, utan att du ska använda matris och vektro-operationer för att göra iterationsstegen. Väldigt mycket av det som görs i for-loopar kan Matlab även lösa genom att multiplicera vektorer och matriser.

Citat:

Det lär dock bli annorlunda senare i 3D då jag kommer behöva räkna med en matris i 4D. Hur vill Matlab ha det då?

http://www.mathworks.com/help/matlab/math/multidimensional-ar...
Punkterna lär ju fortfarade bara vara beroende av sina grannar. Det är ingen stor skillnad.

Permalänk
Entusiast
Skrivet av mix_room:

Även om du itererar, eller framförallt då, vill du att varje iterationssteg ska få fort. Om du behöver lösa problemet 1 gång kan det ta lite mer tid, men behöver du lösa det 1000 gånger behöver du vara snabbare.

Det jag föreslår, och jag även tro att Mikael07 föreslår, är inte att du ska lösa ekvationssystem explicit, utan att du ska använda matris och vektro-operationer för att göra iterationsstegen. Väldigt mycket av det som görs i for-loopar kan Matlab även lösa genom att multiplicera vektorer och matriser.

http://www.mathworks.com/help/matlab/math/multidimensional-ar...
Punkterna lär ju fortfarade bara vara beroende av sina grannar. Det är ingen stor skillnad.

Syftade mer på vilken dimension i en 4D matris som Matlab vill att man itererar över för att det ska gå snabbast. Eller det kanske tappar mening helt då.

Visa signatur

Q9450, HD4850, 8 GB DDR2 800 MHz, 3x750 GB, Antec 300, Dell 2408WFP, U2410, Qnap TS-419p+ 4x2 TB Samsung F4, Asus UL30A-QX056V, Logitech Z-680, Sennheiser HD380pro, M-Audio FastTrack Pro, Ibanez sa160qm, Ibanez TB 15R, Zoom 505II, Ibanez GSR 200, Ibanez SW 35, Cort AC-15, Squier SD-3 BBL, Yamaha PSR 270, Røde NT1-A, Nikon D200, Nikkor 18-70/3,5-4,5, 70-300VR, 50/1,8, 28/2,8, Tamron 17-50/2,8, 90/2,8, Sigma 30/1,4, SB-800, SB-25, SB-24

Permalänk
Medlem

Du ska ju helst inte iterera över matrisen alls.

Jag vet inte om vi pratar bredvid varandra, så jag förklarar med en liten 1D-vektor:

Lösning a - med for-loop

for counterI = 1:length(vector) sumVector = sumVector+vector(counterI) end

Denna lösning är långsam i Matlab

Lösning b - utan for-loop, med matris-operationer:

sumVector = ones(length(vector),1)*vector

Lösning b är betydligt snabbare.

Antagligen kan du forma om din 3D-matris till en dubbelt så stor 2D-matris. Bara att hänga dem efter varandra.

Permalänk
Medlem
Skrivet av Zotamedu:

Jag ska experimentera lite med att transponera och se vad som händer. Det finns egentligen ingen anledning att ställa upp det på ena eller andra sättet som det ser ut nu mer än att jag började. Det lär dock bli annorlunda senare i 3D då jag kommer behöva räkna med en matris i 4D. Hur vill Matlab ha det då?

Du behöver nog inte ens transponera, spelar ingen större roll, bara gör det radvis istället. Om du gör det kolonn- eller radvis så är det inte riktigt Gauss-Seidel ändå. Med korrekt G-S (i 2d) så beräknas det nya itererade värdet i varje gridpunkt (x,y) från två värden från den nya iterationen (x-1,y) och (x,y-1) och två värden från den gamla (x+1,y) och (x,y+1). Men gör du det kolonnvis så tar du bara ett värde från den nya iterationen (x-1,y), medan de tre övriga grannelementen kommer från den gamla iterationen. Det kommer bli rätt till slut ändå, men konvergensen blir långsammare.

Men, som sagt, tiden du tjänar på att åtminstone delvis vektorisera beräkningarna är nog större än förlusten i konvergenstid. Det var därför jag tänkte att en Jacobi-iteration nog skulle vara bättre eftersom det nya värdet då beräknas enbart från den förra iterationen, och hela iterationssteget kan skrivas som en matrisoperation.

Permalänk
Medlem
Skrivet av Zotamedu:

Syftade mer på vilken dimension i en 4D matris som Matlab vill att man itererar över för att det ska gå snabbast. Eller det kanske tappar mening helt då.

Du ska alltid iterera från det "högersta" indexet.

t.ex.

A = zeros(e,d,c,b,a);

här är en 5-dimensionell matris. Du ska då iterera över dimensionen som har 'a' element i innersta loopen. Sen 'b', 'c', osv.

Permalänk
Medlem
Skrivet av Zotamedu:

Egentligen är det inte viktigt att optimera för det har jag inte tid med i exjobbet. Det är en hård tidsplan som det är om jag ska göra allt som min examinator vill ha gjort. Hårdare optimering får han göra själv sen om jag lyckas få till arbetet tillräckligt bra för att det faktiskt ska användas senare. Tar körningen för lång tid får jag helt enkelt använda en grövre mesh. Hade varit grymt kul att pilla med optimering också för det har jag aldrig gjort innan men tyvärr har jag inte riktigt möjligheten för tillfället.

Om du gillar tanken med optimering kan jag starkt rekommendera kursen Högprestandaberäkning! Går i LP4 (jag antar att du går på Chalmers)...
Där får man lära sig att hantera Matlab på bästa sätt, sen går man vidare till C och Fortran och parallellberäkningar med dessa. Om du har knappt om tid pga exjobbet kan det vara värt att bara sitta de 2 första veckorna med Matlab biten.

Riktigt matnyttig kurs!

Permalänk
Entusiast
Skrivet av Mikael07:

Du behöver nog inte ens transponera, spelar ingen större roll, bara gör det radvis istället. Om du gör det kolonn- eller radvis så är det inte riktigt Gauss-Seidel ändå. Med korrekt G-S (i 2d) så beräknas det nya itererade värdet i varje gridpunkt (x,y) från två värden från den nya iterationen (x-1,y) och (x,y-1) och två värden från den gamla (x+1,y) och (x,y+1). Men gör du det kolonnvis så tar du bara ett värde från den nya iterationen (x-1,y), medan de tre övriga grannelementen kommer från den gamla iterationen. Det kommer bli rätt till slut ändå, men konvergensen blir långsammare.

Men, som sagt, tiden du tjänar på att åtminstone delvis vektorisera beräkningarna är nog större än förlusten i konvergenstid. Det var därför jag tänkte att en Jacobi-iteration nog skulle vara bättre eftersom det nya värdet då beräknas enbart från den förra iterationen, och hela iterationssteget kan skrivas som en matrisoperation.

Fast jag är fortfarande i 1D. Anledningen till att jag har en matris är för att jag kör en massbalans över flera storleksklasser på partiklar som har lite olika egenskaper. Så det är fortfarande en rumsdimmension jag löser över men jag behöver flera koncentrationer i varje cell. Självklart finns det en koppling mellan dem genom källtermer som gör problemet lite mer intressant. Det är även det som kommer ge det en matris med en väldigt tråkig dimension senare.

Skrivet av Mikael07:

Du ska alltid iterera från det "högersta" indexet.

t.ex.

A = zeros(e,d,c,b,a);

här är en 5-dimensionell matris. Du ska då iterera över dimensionen som har 'a' element i innersta loopen. Sen 'b', 'c', osv.

Tack, jag ska lägga det på minnet i framtiden. Jag hoppas att Matlab kommer bli en del av mitt yrkesliv men man vet ju aldrig. Många företag verkar tycka att Excel duger som ersättare för att det är "gratis" för dem iom att det hänger med det obligatoriska officepaketet.

Skrivet av Mikael07:

Om du gillar tanken med optimering kan jag starkt rekommendera kursen Högprestandaberäkning! Går i LP4 (jag antar att du går på Chalmers)...
Där får man lära sig att hantera Matlab på bästa sätt, sen går man vidare till C och Fortran och parallellberäkningar med dessa. Om du har knappt om tid pga exjobbet kan det vara värt att bara sitta de 2 första veckorna med Matlab biten.

Riktigt matnyttig kurs!

Låter väldigt intressant. Hur ser det ut med förkunskapskrav? Jag kan som sagt bara Matlab och lite BASIC. Tittade lite på FORTRAN en sommar men gav upp när jag inte hittade en vettig kompilator. Får se om jag kan få in några föreläsningar i schemat. Annars får jag hoppas att jag lyckas få en kul doktorandtjänst så jag blir kvar ett par år till. Då är det ju inga problem att läsa lite extrakurser. Skulle ju iof kunna försöka anmäla mig till kursen och titta på kursmaterialet.

Visa signatur

Q9450, HD4850, 8 GB DDR2 800 MHz, 3x750 GB, Antec 300, Dell 2408WFP, U2410, Qnap TS-419p+ 4x2 TB Samsung F4, Asus UL30A-QX056V, Logitech Z-680, Sennheiser HD380pro, M-Audio FastTrack Pro, Ibanez sa160qm, Ibanez TB 15R, Zoom 505II, Ibanez GSR 200, Ibanez SW 35, Cort AC-15, Squier SD-3 BBL, Yamaha PSR 270, Røde NT1-A, Nikon D200, Nikkor 18-70/3,5-4,5, 70-300VR, 50/1,8, 28/2,8, Tamron 17-50/2,8, 90/2,8, Sigma 30/1,4, SB-800, SB-25, SB-24

Permalänk
Medlem
Skrivet av Zotamedu:

Tack, jag ska lägga det på minnet i framtiden. Jag hoppas att Matlab kommer bli en del av mitt yrkesliv men man vet ju aldrig. Många företag verkar tycka att Excel duger som ersättare för att det är "gratis" för dem iom att det hänger med det obligatoriska officepaketet.

Excel...
Det finns utmärkta open source alternativ. Det finns ett matlabliknande frontend interface som heter Spyder som använder Python bibliotek för beräkningar (vilka i sin tur använder samma bibliotek som matlab använder). Vill man plotta finns Pythonbiblioteket 'matplotlib', som är gjort att likna matlabs funktionalitet. Men gnuplot är nog bättre. Jag har menat att byta länge nu, men är lite lat. När nästa projekt börjar ska jag gå över. Trist att porta grejer man redan gjort.
(ovan gäller Linux, och OS X tror jag. Vet inte hur det är med Win).

Skrivet av Zotamedu:

Låter väldigt intressant. Hur ser det ut med förkunskapskrav? Jag kan som sagt bara Matlab och lite BASIC. Tittade lite på FORTRAN en sommar men gav upp när jag inte hittade en vettig kompilator. Får se om jag kan få in några föreläsningar i schemat. Annars får jag hoppas att jag lyckas få en kul doktorandtjänst så jag blir kvar ett par år till. Då är det ju inga problem att läsa lite extrakurser. Skulle ju iof kunna försöka anmäla mig till kursen och titta på kursmaterialet.

Jag kör bara gfortran, en del av gcc, gratis och gott. Förkunskaper är nog bara elementär matte, men klart det hjälper att ha gjort lite C innan. Men fokus ligger inte på avancerad kod, utan bara att utforma den efter principer som gör att man utnyttjar minne och cpu optimalt.

Permalänk
Medlem

Jag vet inte hur ditt program ser ut, men att använda sparse på matriser med mycket noll-element är något som sparar massor med tid (i tex K-matrisen i FEM-beräkningar).

Sen vet jag att det även finns möjlighet att använda gpu:n (endast nvidia) vid beräkningar, vilket kan spara tid om man har riktigt stora matriser.

Hoppas det är till någon hjälp, och lycka till med exjobbet!

Permalänk
Entusiast
Skrivet av eliasf:

Jag vet inte hur ditt program ser ut, men att använda sparse på matriser med mycket noll-element är något som sparar massor med tid (i tex K-matrisen i FEM-beräkningar).

Sen vet jag att det även finns möjlighet att använda gpu:n (endast nvidia) vid beräkningar, vilket kan spara tid om man har riktigt stora matriser.

Hoppas det är till någon hjälp, och lycka till med exjobbet!

Det är jag medveten om men har inga matriser med massa nollor.

Har faktiskt tittat lite på det men det GT 320 som sitter i datorn på kontoret vill inte samarbeta med Matlab. Fel version på drivrutiner och så vidare. Tycker det är lite tråkigt att Matlab bara kör CUDA för GPU-beräkningar.

Visa signatur

Q9450, HD4850, 8 GB DDR2 800 MHz, 3x750 GB, Antec 300, Dell 2408WFP, U2410, Qnap TS-419p+ 4x2 TB Samsung F4, Asus UL30A-QX056V, Logitech Z-680, Sennheiser HD380pro, M-Audio FastTrack Pro, Ibanez sa160qm, Ibanez TB 15R, Zoom 505II, Ibanez GSR 200, Ibanez SW 35, Cort AC-15, Squier SD-3 BBL, Yamaha PSR 270, Røde NT1-A, Nikon D200, Nikkor 18-70/3,5-4,5, 70-300VR, 50/1,8, 28/2,8, Tamron 17-50/2,8, 90/2,8, Sigma 30/1,4, SB-800, SB-25, SB-24

Permalänk
Medlem
Skrivet av Mikael07:

Minnet ligger lagrat row-major.

Mathworks verkar vara rätt säkra på att det är column-major: http://www.mathworks.se/help/matlab/matlab_external/matlab-da....

Skrivet av Mikael07:

Du ska alltid iterera från det "högersta" indexet.
t.ex.
A = zeros(e,d,c,b,a);
här är en 5-dimensionell matris. Du ska då iterera över dimensionen som har 'a' element i innersta loopen. Sen 'b', 'c', osv.

Varför skulle det vara särskilt effektivt att iterera över dimensionen med störst avstånd (i minnet) mellan element i innersta loopen, det låter lite bakvänt mot vad som är brukligt?
I allmänhet, om man loopar över en matris i Matlab mha just en loop (for/while) för att utföra operationer på ett enskilt element så spelar det antagligen ingen större roll vilken dimension man väljer, loopen i sig kommer att troligtvis att dominera. Ordningen bör snarare styras utav 1: Den ordning som ger bäst vektorisering. 2: Den ordning som ger enklast kod.

Permalänk
Medlem
Skrivet av lntg:

Mathworks verkar vara rätt säkra på att det är column-major: http://www.mathworks.se/help/matlab/matlab_external/matlab-da....

Oj.. där ser man! Klantigt av mig.

Skrivet av lntg:

Varför skulle det vara särskilt effektivt att iterera över dimensionen med störst avstånd (i minnet) mellan element i innersta loopen, det låter lite bakvänt mot vad som är brukligt?

Suck. Drygheter undanbedes.
Men för dom som jag har felinformerat så gäller givetvis det omvända med column-major. Dock spelar det nog mindre roll, som Intg säger, om man itererar elementvis, eftersom for-loopar är så långsamma. Däremot spelar det större roll för vektoriserade operationer, vilka alltså ska utföras kolonnvis, exempelvis

A(:,1) = B(:,2) + C(:,3)

eller om man vill addera 2d strukturer inbäddade i en 3-dimensionell matris

A(:,:,1) = B(:,:,2) + C(:,:,3)

Nu ska det nog vara rätt.