ich den folgenden Code optimieren wollen:Optimierung Ansammlung von Vektoren für die Monte-Carlo-Simulation
Während einer Monte-Carlo-Simulation akkumulieren ich einige Mengen f(x)
(f(x)
teuer zu berechnen ist) und sie im Array speichern bins
nach jeder Probenahme Schritt.
EDIT: f (x) ist nicht eine deterministische Funktion von x (damit meine ich es Pseudozufallszahlen erzeugt und verwendet sie, um das Ergebnis zu ändern), und hängt auch von previoulsy berechneten Werte f (y)
for(int n=0;n<N;n++)
{
// compute some values f(x) at points "p"
for(auto k: p) bins[k] += f(k);
}
p.size()
ist viel kleiner als die Größe bins
, aber schließlich werden die meisten Elemente eingestellt werden.
Nach der Simulation ich meine Endwerte akkumulieren durch eine gewichtete Summe über bins
tun (g
ein Lookup in einem anderen Array):
for(int l=0;l<M;l++)
for(int k=0;k<bins.size();k++)
finalResult[l] += g(k,l)*bins[k];
ich natürlich meine aktualisiert finalResult
nach jedem Abtastschritt berechnen könnte, diese verlangsamt jedoch das Programm sehr, aufgrund der Schleife über M
.
Ich habe schon ein sehr einfaches boost::accumulate
versucht, aber das hat die Leistung nicht verbessert (wenn ich bei diesem Design bleibe, werde ich es irgendwann wegen der Stabilität verwenden müssen, obwohl).
Alle Arrays sind vom Typ Eigen::MatrixXd
, da ich sie für BLAS-Operationen brauche.
p.size() < 10^2 N ~ 10^7 M ~ 10^4 bins.size() ~ 10^5
Haben Sie Vorschläge haben, auf die Techniken zur Optimierung hier nützlich sein könnten?
Die Methode Sie sieht schon ziemlich gut optimiert werden. Gibt es einen Grund, warum Sie erwarten, dass es verbessert werden könnte? Ich würde im Allgemeinen erwarten, dass, wenn man nichts wirklich Dummes macht, als unnötigerweise den gleichen teuren Wert zweimal hintereinander zu berechnen, irgendwelche signifikanten Verbesserungen von den Änderungen auf hohem Niveau zum Monte-Carlo-Simulationsalgorithmus kommen müssten. –
Der Monte-Carlo-Algorithmus ist bereits stark optimiert (es gibt viele Matrix-/Vektor-Produkte, die nicht furthred reduziert werden können). Profilierung Die Anwendung schien darauf hinzudeuten, dass diese Akkumulation die meiste Zeit in Anspruch nimmt. so meine Hoffnung war, dass ich einige weniger offensichtliche Optimierung übersehen – Atom