Мне было поручено взять существующую однопоточную симуляцию Монте-Карло и , оптимизирующую it. Это консольное приложение AC #, без доступа к БД, оно загружает данные один раз из файла CSV и записывает их в конце, так что оно в значительной степени просто связано с процессором , также использует только около 50 МБ памяти.
Я запускал его через профилировщик Jetbrains dotTrace. Из общего времени выполнения около 30% генерируют однородные случайные числа, 24% переводят однородные случайные числа в нормально распределенные случайные числа.
Базовый алгоритм - это множество вложенных циклов , со случайными числами и умножением матриц в центре, каждая итерация возвращает двойное число, которое добавляется в список результатов, этот список периодически сортируется и проверяется на некоторые критерии сходимости (в контрольных точках каждые 5% от общего числа итераций), если это приемлемо, программа прерывает циклы и записывает результаты, в противном случае она переходит к концу.
Я бы хотел, чтобы разработчики взвесили:
- я должен использовать новый поток v ThreadPool
- посмотреть на библиотеку Microsoft Parallels Extension
- мне посмотреть на AForge.Net Parallel.For , http://code.google.com/p/aforge/ каких-либо других библиотек?
Некоторые ссылки на учебные пособия на вышеприведенном весьма приветствуются, поскольку Я никогда не писал параллельный или многопоточный код .
- лучшие стратегии генерации случайных чисел в массовом порядке с последующим их использованием. В этом состоянии приложение никогда не использует унифицированные случайные числа, они всегда переводятся в , обычно распределяются , а затем потребляются.
- хорошие быстрые библиотеки (параллельные?) Для генерации случайных чисел
- соображения памяти, когда я беру эту параллель , сколько мне понадобится лишнего.
Текущее приложение занимает 2 часа для 500 000 итераций, бизнес нуждается в этом, чтобы его можно было масштабировать до 3 000 000 итераций и вызывать его несколько раз в день, поэтому требуется некоторая интенсивная оптимизация.
Particulary хотел бы услышать от людей , которые использовали Microsoft Parallels Extension или AForge.Net Parallel
Это должно быть произведено довольно быстро, поэтому .net 4 beta вышла , хотя я знаю, что в нем есть запрограммированные библиотеки параллелизма, мы можем рассмотреть переход на .net 4 позже, как только он выйдет. , На данный момент на сервере установлен .Net 2, я отправил на проверку обновление до .net 3.5 SP1, которое есть в моем устройстве dev.
Спасибо
Обновление
Я только что попробовал реализацию Parallel.For, но она дает странные результаты.
Однопоточный:
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));
}
Кому:
Parallel.For(0, CHECKPOINTS, i =>
{
results.AddRange(Oblist.Simulate(rnd, dist, n));
});
Внутри имитации есть много вызовов rnd.nextUniform (), Мне кажется, я получаю много одинаковых значений , это может произойти, потому что теперь это параллельно?
Также, возможно, проблемы с вызовом List AddRange не являются потокобезопасными? Я вижу это
System.Threading.Collections.BlockingCollection, возможно, стоит использовать, но в нем есть только метод Add без AddRange, поэтому мне придется просматривать результаты и добавлять потоки безопасным способом. Любое понимание от кого-то, кто использовал Parallel.For высоко ценится. Я временно переключился на System.Random для своих вызовов, так как получал исключение при вызове nextUniform с моей реализацией Mersenne Twister, возможно, это не было безопасным для потоков , получал определенный массив индекс вне границ ....