Строгая балансировка нагрузки нескольких процессов .NET - PullRequest
7 голосов
/ 01 ноября 2011

У меня есть многопроцессное научное моделирование .NET (F #), работающее на Windows Server 2008 SE и 64 процессорах. Каждый временной шаг моделирования колеблется от 1,5 с до 2 с. Поскольку каждый процесс должен ждать других процессов, общая скорость - это скорость самого медленного процесса (2 секунды * число итераций). Поэтому мне нужно максимально уменьшить колебания процессов.

Есть ли способ заставить набор процессов иметь одинаковое «вычислительное время», доступное для их вычислений?

Ответы [ 3 ]

1 голос
/ 01 ноября 2011

Я не знаю, как вы можете попросить ОС попытаться более точно планировать свои процессы, но я знаю, что существует множество исследований по методам, которые избегают архитектуры, которую вы используете именно потому, что этот эффект наименьшего общего знаменателяявляется серьезным узким местом на практике.

Моя любимая статья на эту тему - Сложность кеширования многопоточных кеширующих забывающих алгоритмов от Frigo и Strumpen.Они описывают захватывающие методы, такие как пространственно-временное подразделение, которые превращают объемно-параллельные вычисления, такие как те, которые вы описываете, в произвольно мелкозернистые асинхронные вычисления, которые делают балансировку нагрузки легкой.

1 голос
/ 01 ноября 2011

Возможно ли вам парализовать 2-секундную серию, чтобы у вас было несколько "ветвей" симуляции, происходящих параллельно?

Пример: Предположим, что это 1 симуляция с 4 процессами.Процесс 1 занимает 2 секунды, поэтому вы не можете завершить его до тех пор, пока не завершится процесс 1.


process1---------------------------------------------- (2 sec)
process2-------- (0.5 sec)
process3---- (0.25 sec)
process4---------------------------- (1 sec)

У вас много времени простоя там, где большинство ваших процессов ожидают выполнения процесса 1.
Для работыВы пытаетесь сделать, возможно ли иметь более одного из этих наборов, работающих одновременно?Если это так, то вы могли бы использовать свои незанятые ядра, работая над другими симуляциями, пока они ожидают завершения вашего более продолжительного процесса.

0 голосов
/ 01 ноября 2011

Я не уверен, что на 100% понимаю, что вы хотите сделать. Но для межпроцессной синхронизации вы можете использовать имя EventWaitHandle или Semaphore.

Обновление за комментарий

Вы можете использовать ProcessorAffinity, чтобы ограничить процессы конкретными процессорами.

...