我正在尝试并行化多主体系统的一组模拟,以便它们可以利用我可用的尽可能多的cpu核心(当前为72)。为此,我尝试将每个模拟打包为一个单独的异步计算,然后并行运行它们。
以下代码是我运行模拟的方式。 SimulationLst是模拟初始状态的列表。每个模拟都返回一个整数列表,然后我将其在所有模拟中平均。每次模拟都没有副作用。
SimulationList
|> List.map (fun simulation -> async {return runSimulation simulation})
|> Async.Parallel
|> Async.RunSynchonously
|> Aray.toList
|> List.concat
|> List.average
问题在于,当我运行程序时,前四个模拟会立即开始,但是下一个模拟会很慢地一个接一个地开始。结果是,CPU利用率开始时很差,并且非常缓慢地上升以使用更多的内核。
为什么这些计算没有立即开始是什么原因?是因为我在较高水平上执行此操作(即逐个仿真)吗?更好的并发性会使这项工作更好吗?
这个问题中关于我正在使用的代码的细节并不多,因为有很多,但是请询问更多细节是否有帮助。
答案 0 :(得分:4)
我的猜测是,您处于ThreadPool具有有限数量的可用线程来处理任务的情况,因此正在以0.5 / sec或1 / sec的速度缓慢增加线程数。您应该在运行代码之前尝试调整最小ThreadPool线程数,以查看是否可以缓解问题。