Я пытаюсь распараллелить набор симуляций многоагентных систем, чтобы они могли использовать столько процессорных ядер, сколько мне доступно (в настоящее время 72).Для этого я пытаюсь упаковать каждую симуляцию в отдельное асинхронное вычисление, а затем запустить их параллельно.
Следующий код показывает, как я запускаю симуляцию.SimulationLst - это список начальных состояний симуляции.Каждая симуляция возвращает список целых чисел, которые я затем усредняю по всем симуляциям.Каждая симуляция не имеет побочных эффектов.
SimulationList
|> List.map (fun simulation -> async {return runSimulation simulation})
|> Async.Parallel
|> Async.RunSynchonously
|> Aray.toList
|> List.concat
|> List.average
Проблема в том, что когда я запускаю программу, первые четыре симуляции запускаются сразу, а следующие запускаются очень медленно один за другим.В результате загрузка процессора начинается очень плохо и очень медленно нарастает, чтобы использовать больше ядер.
Какие могут быть причины для того, чтобы эти вычисления не запускались сразу?Это потому, что я делаю это на довольно высоком уровне (т.е. симуляция симуляцией)?Будет ли более тонкий параллелизм зерна сделать эту работу лучше?
В этом вопросе не так много подробностей о коде, который я использую, поскольку его много, но, пожалуйста, попросите более подробную информацию, если это поможет.