Il mio compito corrente è quello di ottimizzare uno Monte Carlo Simulation che calcola le cifre di Adeguatezza del capitale per regione per un insieme di Obbligatori.C# Monte Carlo Incremental Risk Calcolo ottimizzazione, numeri casuali, esecuzione parallela
è in esecuzione circa 10 x troppo lento per cui si dovrà essere in produzione e il numero o corse giornaliere necessarie. Inoltre, la granularità delle cifre dei risultati dovrà essere migliorata fino ad arrivare a un livello possibile, a un certo punto, il codice che ho ricevuto è fondamentalmente un prototipo che viene utilizzato dalle unità aziendali in una capacità di semi produzione.
L'applicazione è attualmente single threaded ne avrei bisogno di renderlo multi-threaded, può guardare System.Threading.ThreadPool
o Microsoft Parallel Extensions biblioteca ma sto costretto a .NET 2 sul server al questa banca quindi dovrei considerare la porta di questo ragazzo, http://www.codeproject.com/KB/cs/aforge_parallel.aspx.
Sto facendo del mio meglio per farli passare a .NET 3.5 SP1, ma è un esercizio importante in un'organizzazione di queste dimensioni e potrebbe non essere possibile nei miei tempi di contratto.
ho fatto il profilo dell'applicazione utilizzando il processo a dotTrace (http://www.jetbrains.com/profiler). Quali altri buoni profiler esistono? Quelli gratuiti?
Molto del tempo di esecuzione è trascorso generazione di numeri casuali uniformi e poi tradurre a un numero casuale distribuzione normale. Stanno usando un'implementazione C# Mersenne twister. Non sono sicuro di dove l'hanno ottenuto o se è il modo migliore per fare questo (o la migliore implementazione) per generare numeri casuali uniformi. Allora questo è tradotto in un versione normalmente distribuito per l'uso nel calcolo (non ho ancora approfondito il codice di traduzione).
Anche ciò che è l'esperienza utilizzando la seguente?
http://www.qlnet.org (C# porto di quantlib) o
Eventuali alternative conoscete? Sono uno sviluppatore C# in modo preferirebbe C#, ma un wrapper per C++ non dovrebbe essere un problema, dovrebbe?
Forse ancora più velocemente sfruttando le implementazioni C++. Sto pensando che alcune di queste librerie avranno il metodo più veloce per generare direttamente numeri casuali distribuiti normalmente, senza il passo della traduzione. Inoltre possono avere alcune altre funzioni che saranno utili nei calcoli successivi.
Anche il computer è su è un Quad Core Opteron 275, 8 GB di memoria, ma Windows Server 2003 Enterprise32 bit. Devo consigliare loro di passare a un sistema operativo a 64 bit?Qualsiasi link ad articoli che supportano questa decisione sarebbe davvero apprezzato.
In ogni caso, qualsiasi consiglio e aiuto che si possa avere è molto apprezzato.
Perché credi che buttare più discussioni sul problema migliorerà le cose? –
Attualmente il codice è single threaded in esecuzione su una scatola quad core, Opteron 275 per la precisione. Il codice viene scritto per essere eseguito in sequenza, sia il compilatore che il CLR o il set di istruzioni della CPU possono prendere la migliore ipotesi su come prendere questo codice e tentare di eseguirne alcune parti in parallelo per migliorare le prestazioni. Oppure posso scrivere questo codice per eseguirlo in un modello parallelo filettato in modo efficace suggerendo al CLR, al compilatore, alla CPU cosa può essere eseguito contemporaneamente e lasciare che queste istruzioni di livello inferiore ottimizzino l'esecuzione. I tuoi pensieri? – m3ntat
8 GB di memoria sono 4 GB di rifiuti su 32 bit ... –