Строгая балансировка нагрузки нескольких процессов .NET

#.net #windows #f# #hpc

#.net #Windows #f# #hpc

Вопрос:

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

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

Комментарии:

1. Есть ли какой-нибудь способ использовать несколько потоков внутри одного процесса вместо нескольких процессов?

2. same "computational time" available Да, только когда он работает на вашей пользовательской ОС, в которой нет никаких других процессов / служб и т. Д

3. Алекс Мур: Мне нужно использовать несколько процессов. Анкур: У меня 64 ядра. Система должна использовать 1 ядро, а остальное оставить для вычислений…

4. Является ли это изменение следствием увеличения времени процессора или из-за различий в самой вычислительной мощности? Некоторые временные шаги могут просто занять больше времени.

5. Ну, для моих целей тестирования шаги и работа полностью идентичны на всех ядрах.

Ответ №1:

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

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

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

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

Ответ №2:

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

Моя любимая статья на эту тему — The cache complexity of multithreaded cache oblivious algorithms Фриго и Стрампена. Они описывают увлекательные методы, такие как разделение пространства-времени, которые превращают объемно-параллельные вычисления, подобные описанному вами, в произвольно детализированные асинхронные вычисления, упрощающие балансировку нагрузки.

Комментарии:

1. Лучшим способом было бы выделить 1 процессор для 1 процесса. Возможно ли это?

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

Ответ №3:

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

Обновление для каждого комментария

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

Комментарии:

1. Это не то, что я имею в виду. Другими словами, мне нужно выделить 1 процессор для 1 процесса или аналогичного. Так что все мои процессы имеют одинаковую «мощность / скорость».

2. ProcessorAffinity наиболее близок к решению, поэтому я отмечу его как ответ. Но я прочитал много предупреждений о том, чтобы не использовать ProcessorAffinity, поэтому, вероятно, я буду придерживаться системы, чтобы выбрать лучшее для меня.