【发布时间】:2017-02-22 14:59:27
【问题描述】:
我一直在尝试利用并行化来使用 MEEP 模拟软件更快地运行一些模拟。默认情况下,该软件仅使用一个 CPU,并且 FDTD 仿真很容易通过并行化加速。最后我发现运行1核或4核没有区别,模拟时间是一样的。
然后我想我会改为在每个内核上运行单独的模拟以增加我的总模拟吞吐量(例如同时运行 4 个不同的模拟)。
令我惊讶的是,每当我开始新的模拟时,已经开始的模拟会变慢,即使它们在不同的内核上运行。例如,如果我只在 1 个内核上运行 1 个模拟,则 FDTD 模拟的每个时间步长大约需要 0.01 秒。如果我在另一个内核上启动另一个进程,每个模拟现在每个时间步花费 0.02 秒,依此类推,这意味着即使我在不同的内核上运行彼此无关的不同模拟,它们都会减慢速度,让我没有速度净增加。
我不一定要寻求帮助来解决这个问题,就像我寻求帮助来理解它一样,因为它激发了我的好奇心。每个模拟实例需要的内存不到我总内存的 1%,所以这不是内存问题。我唯一能想到的就是共享缓存内存的内核,或者内存带宽饱和,有没有办法检查是否是这种情况?
模拟相当简单,我运行的程序比这个更需要内存,并且在并行化方面有很大的加速。
有什么提示可以帮助我理解这种现象吗?
【问题讨论】:
-
您的分析是一个好的开始,但还有其他可能的问题:降低涡轮频率、超线程/AMD 推土机“模块”,但如果没有更具体的系统和应用程序信息,则无法判断
-
数据长度是多少? 100 MB?尝试使所有内核仅在 1MB 部分上工作,然后在完成后继续在另一部分上工作。这样,当一个核心访问一个单元时,另一个核心可以将其作为另一个单元的邻居来访问。
-
您可以使用
perfLinux 事件分析器快速检查那里可能发生的情况。你知道模拟是否依赖文件访问?如果多个进程竞争独占文件访问,它也可能在进程间级别产生序列化。
标签: parallel-processing mpi meep