comparison Notes.md @ 1286:23f3b62388ba refactor/grids

Add some notes about grid functions:
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 03 Mar 2023 15:40:04 +0100
parents 79647b60a73b
children 31d0b7638304
comparison
equal deleted inserted replaced
1285:7d52c4835d15 1286:23f3b62388ba
259 component(gf,2,3) # (2,3) elementet av en matris 259 component(gf,2,3) # (2,3) elementet av en matris
260 component(gf,:,2) # Andra kolumnen av en matris 260 component(gf,:,2) # Andra kolumnen av en matris
261 @ourview gf[:,:][2] 261 @ourview gf[:,:][2]
262 ``` 262 ```
263 263
264 ### Prestanda-aspekter
265 [Vidar, Discord, 2023-03-03]
266 Typiskt sett finns det två sätt att representera vektorvärda gridfunktioner AbstractArray{T,Dim} där T är en vektor över komponenterna. Man skulle alltså i 1D ha
267 u = [ [u1[x1], u2[x1]] , [u1[x2], u2[x2]], ... [u1[xN], u2[xN]]]. Detta brukar kallas array of structs (AoS). Alternativet är struct of arrays (SoA), där man har alla gridpunkter för en given komponent u = [[u1[x1], u1[x2]],... u1[xN]], [u2[x1], u2[x2], ... u2[xN]]].
268
269 Personligen tycker jag att AoS känns som den mer naturliga representationen? Det skulle göra det enklarare att parallelisera en vektorvärd gridfunktion över gridpunkterna, och om man opererar på olika komponenter i samma funktion så är det också bra ur en minnesaccess-synpunkt då dessa kommer ligga nära vandra i minnet. Problemet är att AoS sabbar vektorisering på CPU då två gridpunkter i en komponent ligger långt bort från varandra. Efter lite eftersökningar (och efter att snackat lite med Ossian) så verkar det ändå som att AoS är dåligt på GPU, där man vill att trådar typiskt sett utföra samma operation på närliggande minne.
270
271 Vad tänker du kring detta ur ett interface-perspektiv? Jag hittade paketet https://github.com/JuliaArrays/StructArrays.jl som verkar erbjuda AoS-interface men SoA-minneslayout så det kanske kan vara något vi kan använda? Inte native-stödd på samma sätt som SVector, men verkar iaf utvecklas aktivt.
272
273 [Efter telefonsamtal] För optimal prestanda behöver vi antagligen se till att man kan räkna ut varje komponent i en punkt individuellt. Detta så att man har frihet att till exempel låta den innersta loopen hålla komponentindexet konstant för att underlätta intruktionsvektorisering.
274
264 ## Performance measuring 275 ## Performance measuring
265 We should be measuring performance early. How does our effective cpu and memory bandwidth utilization compare to peak performance? 276 We should be measuring performance early. How does our effective cpu and memory bandwidth utilization compare to peak performance?
266 277
267 We should make these test simple to run for any solver. 278 We should make these test simple to run for any solver.
268 279