Meine aktuelle Aufgabe besteht darin, einen Monte Carlo Simulation zu optimieren, der Kapitaladäquanzzahlen nach Region für eine Reihe von Obligors berechnet.C# Monte Carlo Incremental Risk Berechnungsoptimierung, Zufallszahlen, parallele Ausführung
Es läuft ungefähr 10 x zu langsam für wo es in der Produktion sein muss und Anzahl oder tägliche Läufe erforderlich sind. Zusätzlich muss die Granularität der Ergebniszahlen irgendwann bis auf den Schreibtisch, möglicherweise auf Buchebene, verbessert werden. Der Code, den ich erhalten habe, ist im Grunde ein Prototyp, der von Geschäftseinheiten in einer Semi-Produktionskapazität verwendet wird.
Die Anwendung ist zur Zeit Single-Threaded so werde ich es machen müssen Multi-Threaded, bei System.Threading.ThreadPool
oder die Microsoft aussehen Parallel Extensions Bibliothek, aber ich bin zu .NET 2 auf dem Server beschränkt auf Diese Bank, so muss ich vielleicht den Hafen dieses Kerls, http://www.codeproject.com/KB/cs/aforge_parallel.aspx betrachten.
Ich versuche mein Bestes, um sie auf .NET 3.5 SP1 zu aktualisieren, aber es ist eine große Übung in einer Organisation dieser Größe und möglicherweise nicht in meinen Vertragszeitrahmen möglich.
Ich habe die Anwendung Profil die Studie von dotTrace (http://www.jetbrains.com/profiler) verwendet wird. Welche anderen guten Profiler gibt es? Freie?
Ein Großteil der Ausführungszeit wird ausgegeben Generierung von einheitlichen Zufallszahlen und dann übersetzen diese in eine normalverteilte Zufallszahl. Sie verwenden eine C# Mersenne twister Implementierung. Ich bin mir nicht sicher, wo sie es hinbekommen haben oder ob es der beste Weg ist, um diese (oder die beste Implementierung) zu erreichen, um die einheitlichen Zufallszahlen zu erzeugen. Dann ist dies übersetzt in eine normal verteilte Version für die Verwendung in der Berechnung (Ich habe noch nicht in den Übersetzungscode eingetaucht).
Auch was ist die Erfahrung mit den folgenden?
http://www.qlnet.org (C# Hafen von quantlib) oder
Alle Alternativen, die Sie kennen? Ich bin ein C# -Entwickler also würde C# bevorzugen, aber ein Wrapper zu C++ sollte kein Problem sein, sollte es?
Vielleicht noch schneller die C++ - Implementierungen zu nutzen. Ich denke, einige dieser Bibliotheken haben die schnellste Methode, um normal verteilte Zufallszahlen ohne den Übersetzungsschritt direkt zu erzeugen. Sie können auch einige andere Funktionen haben, die bei den nachfolgenden Berechnungen hilfreich sind.
Auch macht der Rechner eingeschaltet ist ein Quad-Core Opteron 275, 8 GB Speicher, aber Windows Server 2003 Unternehmen 32-Bit-. Sollte ich ihnen raten, auf ein 64 bit OS zu aktualisieren?Irgendwelche Links zu Artikeln, die diese Entscheidung unterstützen, würden wirklich geschätzt werden.
Wie auch immer, jeder Rat und jede Hilfe, die Sie haben können, wird wirklich geschätzt.
Warum glauben Sie, dass das Werfen weiterer Threads das Problem verbessern wird? –
Derzeit ist der Code single-threaded auf einer Quad-Core-Box, Opteron 275 um genau zu sein. Der Code wird so geschrieben, dass er sequenziell ausgeführt wird. Entweder der Compiler oder der CLR- oder der CPU-Befehlssatz kann den Code am besten erraten und versuchen, Teile davon parallel auszuführen, um die Leistung zu verbessern. Oder ich kann diesen Code so schreiben, dass er in einem parallelen Threaded-Modell ausgeführt wird, was der CLR, dem Compiler und der CPU nahe legt, was gleichzeitig ausgeführt werden kann und diese Anweisungen auf niedrigerer Ebene die Ausführung optimieren lassen. Ihre Gedanken? – m3ntat
8 GB Speicher ist 4 GB Abfall auf 32 Bit ... –