Przeprowadź migrację aplikacji z jednym wątkiem do wielowątkowego, równoległego wykonywania symulacji monte carlo

Otrzymałem zadanie zabraniaistniejąca symulacja monte carlo z jednym wątkiem ioptymalizacja to. Jest to aplikacja konsoli c #, bez dostępu do bazy danych, która ładuje dane raz z pliku csv i wypisuje je na końcu, więc to jestw zasadzie tylko procesor związany, używa tylko około 50 MB pamięci.

Uruchomiłem go za pomocą programu profilującego dotTrace Jetbrains. Całkowity czas wykonania około 30% generuje jednolite liczby losowe, 24% tłumaczy jednolite liczby losowe na liczby losowe o rozkładzie normalnym.

Podstawyalgorytm to całe mnóstwo zagnieżdżonych pętli, w przypadku losowych wywołań liczbowych i mnożenia macierzy w środku, każda iteracja zwraca podwójną liczbę, która jest dodawana do listy wyników, ta lista jest okresowo sortowana i testowana pod kątem niektórych kryteriów zbieżności (w punktach kontrolnych co 5% całkowitej liczby iteracji), jeśli jest to dopuszczalne program wyłamuje się z pętli i zapisuje wyniki, w przeciwnym razie przechodzi do końca.

Chciałbym, aby programiści rozważyli:

powinienem użyćnew Thread v ThreadPoolpowinienem spojrzeć naBiblioteka Microsoft Parallels Extensionpowinienem na to spojrzećAForge.Net Parallel.For, http://code.google.com/p/aforge/ jakieś inne biblioteki?

Trochęlinki do samouczków na powyższym będzie mile widziane jakNigdy nie napisałem żadnego kodu równoległego ani wielowątkowego.

najlepsze strategie generowania liczb losowych o rozkładzie masowym, a następnie ich konsumowania. Jednolite liczby losowe nigdy nie są używane w tym stanie przez aplikację, są one zawsze tłumaczone nanormalnie dystrybuowane a następnie skonsumowane.dobre szybkie biblioteki (równoległe?) do generowania liczb losowychwzględy pamięci, gdy biorę tę równoległość, ile dodatkowego wymagam.

Obecna aplikacja zajmuje 2 godziny dla 500 000 iteracji, biznes potrzebuje skalowania do 3 000 000 iteracji i może być nazywany mnogimi czasami dziennie, więc potrzebna jest duża optymalizacja.

Szczególnie chciałbym usłyszeć od ludzi którzy skorzystaliRozszerzenie Microsoft Parallels lubAForge.Net Parallel

To musi być produkowane dość szybko, więc.net 4 beta jest już niedostępny mimo że wiem, że ma zapieczętowane biblioteki współbieżności, możemy spojrzeć na migrację do .net 4 później w dół ścieżki po jej wydaniu. Na chwilę obecną serwer ma .Net 2, zgłosiłem do przeglądu aktualizację do .net 3.5 SP1, którą ma moje pole dev.

Dzięki

Aktualizacja

Właśnie wypróbowałem implementację Parallel.For, ale pojawiają się dziwne wyniki. Pojedynczy wątek:

IRandomGenerator rnd = new MersenneTwister();
IDistribution dist = new DiscreteNormalDistribution(discreteNormalDistributionSize);
List<double> results = new List<double>();

for (int i = 0; i < CHECKPOINTS; i++)
{
 results.AddRange(Oblist.Simulate(rnd, dist, n));
}

Do:

Parallel.For(0, CHECKPOINTS, i =>
        {
           results.AddRange(Oblist.Simulate(rnd, dist, n));
        });

Wewnątrz symulacji jest wiele wywołań rnd.nextUniform (),Myślę, że otrzymuję wiele wartości, które są takie same, czy to się może zdarzyć, ponieważ jest teraz równoległe?

Może również problemy z wywołaniem List AddRange nie są bezpieczne dla wątków? widzę to

System.Threading.Collections.BlockingCollection może być warty użycia, ale ma tylko metodę Add no AddRange, więc musiałbym tam przejrzeć wyniki i dodać w bezpieczny sposób wątek. Każdy wgląd od kogoś, kto używał Parallel.For bardzo doceniony. Przełączyłem się naSystem.Random dla moich połączeń tymczasowo, ponieważ otrzymywałem wyjątek podczas wywoływania nextUniform z moją implementacją Mersenne Twister,może to nie było bezpieczne nici pewna tablica otrzymywałaindeks poza granicami....

questionAnswers(3)

yourAnswerToTheQuestion