Mi tarea actual es optimizar un Monte Carlo Simulation que calcula las cifras de adecuación de capital por región para un conjunto de deudores.C# Monte Carlo Riesgo incremental Optimización del cálculo, números aleatorios, ejecución paralela
Se está ejecutando aproximadamente 10 veces más lento para donde tendrá que estar en producción y se necesita un número o ejecuciones diarias. Además, la granularidad de las cifras de resultados tendrá que mejorarse hasta el nivel de libro de escritorio, posiblemente, en algún momento, el código que me han dado es básicamente un prototipo que las unidades de negocio utilizan en una capacidad de semi producción.
La aplicación es actualmente el único subproceso así que necesitaré para que sea multi-hilo, puede mirar a System.Threading.ThreadPool
o la Microsoft Parallel Extensions biblioteca, pero estoy obligado a .NET 2 en el servidor en este banco, así que quizás tenga que considerar el puerto de este tipo, http://www.codeproject.com/KB/cs/aforge_parallel.aspx.
Hago todo lo posible para que se actualicen a .NET 3.5 SP1, pero es un ejercicio importante en una organización de este tamaño y podría no ser posible en mis marcos de tiempo de contrato.
que he perfilado la aplicación usando el ensayo de dotTrace (http://www.jetbrains.com/profiler). ¿Qué otros buenos perfiladores existen? ¿Gratis?
Gran parte del tiempo de ejecución se gasta generando números aleatorios uniformes y luego traduciéndolo a un número aleatorio distribuido normalmente. Están utilizando una implementación de C# Mersenne twister. No estoy seguro de dónde lo obtuvieron o si es la mejor manera de hacerlo (o la mejor implementación) para generar los números aleatorios uniformes. Entonces esto es traducido a una versión normalmente distribuida para usar en el cálculo (aún no he profundizado en el código de traducción).
¿Cuál es la experiencia al utilizar lo siguiente?
http://www.qlnet.org (C# puerto de QuantLib) o
Cualquier alternativa que conozca? Soy desarrollador de C# por lo que preferiría C#, pero un contenedor para C++ no debería ser un problema, ¿o sí?
Quizás incluso más rápido aprovechando las implementaciones de C++. Estoy pensando que algunas de estas bibliotecas tendrán el método más rápido para generar directamente números aleatorios distribuidos normalmente, sin el paso de traducción. También pueden tener algunas otras funciones que serán útiles en los cálculos posteriores.
También el ordenador está en un núcleo Opteron es quad 275, 8 GB de memoria pero Windows Server 2003 Empresa 32 bits. ¿Debo recomendarles que actualicen a 64 bit OS?Cualquier enlace a artículos que respalden esta decisión sería realmente apreciado.
De todos modos, cualquier consejo y ayuda que pueda tener es realmente apreciado.
¿Por qué crees que tirar más hilos al problema mejorará las cosas? –
Actualmente, el código es de un solo hilo ejecutándose en una caja de cuatro núcleos, Opteron 275 para ser precisos. El código está escrito para ejecutarse de forma secuencial, ya sea el compilador o el CLR o el conjunto de instrucciones de la CPU que puede adivinar cómo tomar este código e intentar ejecutar partes de él en paralelo para mejorar el rendimiento. O puedo escribir este código para ejecutarlo en un modelo paralelo enhebrado, sugiriendo efectivamente al CLR, compilador y CPU lo que se puede ejecutar al mismo tiempo y permitir que estas instrucciones de nivel inferior luego optimicen la ejecución. ¿Tus pensamientos? – m3ntat
8 GB de memoria son 4 GB de desperdicio en 32 bits ... –