Hoi,
Ik heb eigenlijk wat hele algemene vragen over de manier hoe CPUs met intructies omgaan, maar ik heb niet echt een antwoord kunnen vinden op wikipedia of howstuffworks etc.
Ik ben op dit moment bezig met een numeriek model om turbulentie te simuleren. Op dit moment doet dit model er 120 uur over om de berekeningen te doen die nodig zijn. (op één core van een Core 2 Quad) Dit kan ik spreiden over alle cores, maar dan nog steeds duurt het erg lang om alles te simuleren.
Ik wil graag weten hoe ik dit kan versnellen. Ik heb eigenlijk alleen wat informatie van mijn oude programmeer lessen in C++, die af en toe vaag over efficientie van processoren gingen. Zoals: vermijd for loops, en if statements zijn traag.
Van wat ik heb gelezen (maar niet zeker of ik het helemaal begrijp) is het vermijden van for loops handig, omdat branch prediction ~dan beter werkt. En ik weet niet of met huidige processors een if statement veel trager verloopt dan een andere rekenkundige bewerking.
Nog even terug naar waarom ik dit wil weten:
In mijn model worden in de orde van vele miljarden double floating points bewerkingen gedaan (double precision is nodig), en honderden miljoenen if statements uitgevoerd. Stel dat ik het aantal if statements halveer, levert dit dan een significante snelheidswinst op? (als if statements gelijk zijn aan rekenkundige operaties levert het zo'n 1% snelheidswinst op, als if statements veel langer duren een rekenkundige operatie, dan levert het dus veel meer snelheidswinst op)
En als je dubbele if statements gebruikt zoals
if a == 1 || b ==2
Wordt dan in alle gevallen zowel de check a==1 en b==2 uitgevoerd? Of gaat de code al door als 1 van de twee waar is? Dus stel dat a==1 meestal waar is, is het dan nuttig om a==1 eerder te laten checken dan b == 2? En hoe werkt dat in de syntax (wat natuurlijk per taal verschillend is waarschijnlijk)
Het model is geschreven in IDL, dat zeer snel is met matrix vermenigvuldigen, maar langzaam met uitlezen van waarden uit vectors (waarom zou ik graag willen weten).
Ik vind dit allemaal erg interessant om te weten, dus als jullie websites kunnen geven waar dit duidelijk uitgelegd wordt(of zelf de moeite nemen om een heel verhaal te typem) dan erg bedankt!
Ik heb eigenlijk wat hele algemene vragen over de manier hoe CPUs met intructies omgaan, maar ik heb niet echt een antwoord kunnen vinden op wikipedia of howstuffworks etc.
Ik ben op dit moment bezig met een numeriek model om turbulentie te simuleren. Op dit moment doet dit model er 120 uur over om de berekeningen te doen die nodig zijn. (op één core van een Core 2 Quad) Dit kan ik spreiden over alle cores, maar dan nog steeds duurt het erg lang om alles te simuleren.
Ik wil graag weten hoe ik dit kan versnellen. Ik heb eigenlijk alleen wat informatie van mijn oude programmeer lessen in C++, die af en toe vaag over efficientie van processoren gingen. Zoals: vermijd for loops, en if statements zijn traag.
Van wat ik heb gelezen (maar niet zeker of ik het helemaal begrijp) is het vermijden van for loops handig, omdat branch prediction ~dan beter werkt. En ik weet niet of met huidige processors een if statement veel trager verloopt dan een andere rekenkundige bewerking.
Nog even terug naar waarom ik dit wil weten:
In mijn model worden in de orde van vele miljarden double floating points bewerkingen gedaan (double precision is nodig), en honderden miljoenen if statements uitgevoerd. Stel dat ik het aantal if statements halveer, levert dit dan een significante snelheidswinst op? (als if statements gelijk zijn aan rekenkundige operaties levert het zo'n 1% snelheidswinst op, als if statements veel langer duren een rekenkundige operatie, dan levert het dus veel meer snelheidswinst op)
En als je dubbele if statements gebruikt zoals
if a == 1 || b ==2
Wordt dan in alle gevallen zowel de check a==1 en b==2 uitgevoerd? Of gaat de code al door als 1 van de twee waar is? Dus stel dat a==1 meestal waar is, is het dan nuttig om a==1 eerder te laten checken dan b == 2? En hoe werkt dat in de syntax (wat natuurlijk per taal verschillend is waarschijnlijk)
Het model is geschreven in IDL, dat zeer snel is met matrix vermenigvuldigen, maar langzaam met uitlezen van waarden uit vectors (waarom zou ik graag willen weten).
Ik vind dit allemaal erg interessant om te weten, dus als jullie websites kunnen geven waar dit duidelijk uitgelegd wordt(of zelf de moeite nemen om een heel verhaal te typem) dan erg bedankt!