我的问题可能是微不足道的。我使用 MPI 库并行化了 CFD 代码,现在我正在尝试研究我的并行效率。首先,我创建了一个案例,它将在行列之间提供相等的负载,并且传输数据的计算量比率恒定。因此,我的期望是,随着排名的增加,任何运行时更改都将仅归因于通信延迟。 但是,我意识到不调用秩通信的子例程(因此它们只执行域计算,因此它们处理所有秩的相同负载)对运行时增加的贡献很大——实际上是最多的。我在这里错过了什么?这甚至有意义吗?
这甚至有意义吗?
是的!
您创建的流程越多(每个进程都有一个等级),您就越能达到系统以真正并行方式执行流程的能力极限。
您的系统(例如您的计算机)可以并行运行一定数量的进程,当超过此限制时,一些进程会等待执行(因此并非所有进程都并行运行),这会损害性能。
例如,假设一台计算机有 4 个内核,而您创建了 4 个进程,那么每个内核都可以执行一个进程,因此您的性能会受到进程之间通信(如果有)的影响。
现在,在同一台计算机中,您创建了 8 个进程。会发生什么?
其中 4 个进程将开始并行执行,但其他 4 个进程将等待内核可用,以便它们也可以运行。这不是真正的并行执行(某些进程将以线性方式执行)。此外,根据操作系统调度策略,某些进程可能会交错,从而导致每个交换机的开销。