Параллельные асинхронные задачи не выполняются одновременно - PullRequest
2 голосов
/ 28 мая 2019

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

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

SimulationList
|> List.map (fun simulation -> async {return runSimulation simulation})
|> Async.Parallel
|> Async.RunSynchonously
|> Aray.toList
|> List.concat
|> List.average

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

Какие могут быть причины для того, чтобы эти вычисления не запускались сразу?Это потому, что я делаю это на довольно высоком уровне (т.е. симуляция симуляцией)?Будет ли более тонкий параллелизм зерна сделать эту работу лучше?

В этом вопросе не так много подробностей о коде, который я использую, поскольку его много, но, пожалуйста, попросите более подробную информацию, если это поможет.

1 Ответ

4 голосов
/ 28 мая 2019

Я полагаю, что вы находитесь в ситуации, когда ThreadPool имеет ограниченное количество потоков, доступных для обработки задач, и поэтому медленно увеличивает количество потоков со скоростью 0,5 / сек или 1 / сек.Вы должны попытаться отрегулировать минимальное число потоков ThreadPool перед запуском кода, чтобы увидеть, облегчает ли это проблему.

...