我有一个在Windows Server 2008 SE和64个处理器上运行的多进程.NET(F#)科学模拟。模拟的每个时间步长从1.5秒振荡到2秒。由于每个进程必须等待其他进程,因此总速度是最慢进程的速度(2秒*迭代次数)。因此,我需要尽可能地减少过程的振荡。
有没有办法强制一组进程为计算提供完全相同的“计算时间”?
答案 0 :(得分:1)
您是否有可能对2秒系列进行并列化,以便您可以并行进行模拟的多个“分支”?
实施例: 假设这是4个过程的1次模拟。过程1需要2秒钟,因此在过程1完成之前无法完成。
process1---------------------------------------------- (2 sec)
process2-------- (0.5 sec)
process3---- (0.25 sec)
process4---------------------------- (1 sec)
你的大部分流程都在等待流程1,你有很多空闲时间。
对于您正在尝试的工作,是否可以同时运行多个这些集合?如果是这样,那么您可以在等待较长时间运行的过程完成其他模拟时利用空闲核心。
答案 1 :(得分:1)
我不知道你怎么能要求操作系统尝试更公平地安排你的过程,但我知道有很多关于技术的研究正在避免你正在使用的架构正是因为这个最低的共同点效应是实践中的一个主要瓶颈。
我最喜欢的论文是Frigo和Strumpen的The cache complexity of multithreaded cache oblivious algorithms。它们描述了一些引人入胜的技术,例如时空细分,它将大量并行计算(例如您所描述的计算)转换为任意细粒度的异步计算,使负载平衡毫不费力。
答案 2 :(得分:0)
我不确定我100%理解你想做什么。但对于进程间同步,您可以使用名为EventWaitHandle
或Semaphore
。
您可以使用ProcessorAffinity
将进程限制为特定处理器。