我有一个在 Windows Server 2008 SE 和 64 个处理器上运行的多进程 .NET (F#) 科学模拟。模拟的每个时间步长从 1.5 秒到 2 秒振荡。由于每个进程都必须等待其他进程,因此总体速度是最慢进程的速度(2 秒 * 迭代次数)。因此,我需要尽可能地减少过程的振荡。
有什么方法可以强制一组进程具有完全相同的“计算时间”可用于其计算?
您是否可以并行化 2 秒系列,以便您有多个并行发生的模拟“分支”?
示例:假设这是 1 个具有 4 个进程的模拟。过程 1 需要 2 秒,因此在过程 1 完成之前您无法完成。
process1---------------------------------------------- (2 sec)
process2-------- (0.5 sec)
process3---- (0.25 sec)
process4---------------------------- (1 sec)
您在那里有很多空闲时间,您的大多数进程都在等待进程 1。
对于您正在尝试做的工作,同时运行多个这些集合是否可行?如果是这样,那么您可以通过处理其他模拟来利用您的空闲内核,同时它们正在等待您的较长运行过程完成。
我不知道您如何要求操作系统尝试更公平地安排您的进程,但我知道有很多关于避免您正在使用的架构的技术的研究,因为这种最低公分母效应是一个主要的实践中的瓶颈。
我最喜欢的关于这个主题的论文是Frigo 和 Strumpen的多线程缓存遗忘算法的缓存复杂性。他们描述了令人着迷的技术,例如时空细分,可以将您描述的批量并行计算转变为任意细粒度的异步计算,从而轻松实现负载平衡。
我不确定我是否 100% 了解您想要做什么。但是对于进程间同步,您可以使用命名EventWaitHandle
或Semaphore
.
您可以使用ProcessorAffinity
将进程限制到特定的处理器。