Добрый день!
Есть задача, которую хотелось бы распараллелить.
Имеются функции
y1 = F1(x1, x2, ..., xn),
y2 = F2(x1, x2, ..., xn)
xi, y1, y2 - вещественные числа;
ОДЗ (область допустимых значений) F1 явл. подмн. ОДЗ F2.
Задача: перебрать всевозможные наборы (xi), вычислить y1 и y2, зафиксировать (записать в файл) набор (xi), y1, y2, если |y1 - y2| < e (разница по модулю меньше заданного e).
Выделил следующие функции:
1. Функция A производит перебор наборов (x1, x2, ..., xn) для y1, является рекурсивной, не представляю как ее можно привести в другой вид;
Вычисление следующего набора занимает времени меньше чем 0.001 (обычно 0.0002) сек.;
2. Функция B - вычисление y1, 0.100 - 0.300 сек.;
3. Функция C - вычисление y2, может быть двух реализаций: 0.100 - 0.200 сек. или ~1-2 сек. - вторую реализацию скорее всего делать не будем.
Вышеописанные измерения только примерные (просто много раз вызывали методы, мерили при помощи Stopwatch и записывали результат в файл), но описанные диапазоны выдерживают. Измерения производились на Intel(R) Core(TM) i5 CPU 760 @ 2.80GHz.
Распараллеливание задачи представляю след. образом:
1. главный поток - выполняет A, результаты складывает в общую для потоков очередь;
2. функция P - берет очередной набор из очереди, вычисляет y1, y2, сравнивает разницу, записывает в файл при необходимости;
3. функцию P запустить в нескольких потоках.
Реализация функций A, B, C уже есть на C#.
С потоками знаком только на WinAPI, прочитал статью на RSDN Работа с потоками в C#. Есть некоторые представления, про распараллеливание, но хотелось бы добиться максимальной производительности, т.к. по нашим подсчетам количество всевозможных (xi) больше 10e+9.
Прошу в примерах показать возможные способы распараллеливания.
UPD
Опечатка: количество всевозможных (xi) больше 10e+9.
Или использовать очередь с ограничением количества элементов в ней, тогда система будет самосинхронизироваться. (что-то такое я писал в своем последнем комментарии к этому исследованию (правда, примеры на Си)).
– avp May 31 '13 at 09:10BlockingCollection, что очень упрощает реализацию. Но метод PLINQ кажется проще. – Ildar Jun 07 '13 at 07:27