Parallel processing 令人尴尬的并行执行,无加速(MEEP、openMPI)

Parallel processing 令人尴尬的并行执行,无加速(MEEP、openMPI),parallel-processing,mpi,meep,Parallel Processing,Mpi,Meep,我一直在尝试利用并行化,以更快地使用MEEP仿真软件运行一些仿真。默认情况下,软件只使用一个CPU,FDTD模拟很容易通过并行化加速。最后,我发现运行1个或4个内核之间没有差异,模拟时间是相同的 然后我想我应该在每个核心上运行单独的模拟,以增加我的总模拟吞吐量(例如,同时运行4个不同的模拟) 我发现令人惊讶的是,每当我开始一个新的模拟时,已经开始的模拟都会变慢,即使它们运行在不同的内核上。例如,若我只在一个核心上运行一个模拟,FDTD模拟的每个时间步长大约需要0.01秒。如果我在另一个内核上启动

我一直在尝试利用并行化,以更快地使用MEEP仿真软件运行一些仿真。默认情况下,软件只使用一个CPU,FDTD模拟很容易通过并行化加速。最后,我发现运行1个或4个内核之间没有差异,模拟时间是相同的

然后我想我应该在每个核心上运行单独的模拟,以增加我的总模拟吞吐量(例如,同时运行4个不同的模拟)

我发现令人惊讶的是,每当我开始一个新的模拟时,已经开始的模拟都会变慢,即使它们运行在不同的内核上。例如,若我只在一个核心上运行一个模拟,FDTD模拟的每个时间步长大约需要0.01秒。如果我在另一个内核上启动另一个进程,每个模拟现在每个时间步花费0.02秒,以此类推,这意味着即使我在不同的内核上运行与彼此无关的不同模拟,它们都会减速,不会给我带来速度的净增长

我不一定是在寻求帮助来解决这个问题,而是在寻求帮助来理解它,因为它激发了我的好奇心。模拟的每个实例需要的内存不到我总内存的1%,所以这不是内存问题。我能想到的唯一一件事是共享高速缓存的内核,或者内存带宽饱和,有没有办法检查这种情况

模拟是相当简单的,我运行的程序比这个程序内存消耗大得多,并行化的速度大大加快


有什么提示可以帮助我理解这种现象吗?

我认为最好在更大的模拟上看一下,因为类似turbo boost技术的众所周知的问题(单核性能随线程数的变化)无法解释您的结果。它将解释我们是否有一个单核处理器


所以,我认为这可以用内存缓存级别来解释。也许如果您尝试比L3缓存大得多的模拟(i7大于8MB)。

我认为应该更好地考虑更大的模拟,因为类似turbo boost技术的众所周知的问题(单核性能随线程数的变化)无法解释您的结果。它将解释我们是否有一个单核处理器

所以,我认为这可以用内存缓存级别来解释。如果您尝试比L3缓存大得多的模拟(i7大于8MB)。

我在英特尔(R)核心(TM)i7-3517U CPU@1.90GHz双核(4个线程)上的测试。1个mpi线程(-np 1)的所有模拟

10mb模拟:

  • 四次模拟0.0255秒/步
  • 两次模拟0.0145秒/步
  • 一次模拟0.0129秒/步

    100mb模拟:

  • 四次模拟1.13秒/步

  • 两次模拟0.61秒/步
  • 一次模拟0.53秒/步
奇怪的是,两个模拟(每个模拟有2个线程)的运行速度几乎与两个模拟(每个模拟有1个线程)的运行速度相同。

我在Intel(R)Core(TM)i7-3517U CPU@1.90GHz双核(4个线程)上的测试。1个mpi线程(-np 1)的所有模拟

10mb模拟:

  • 四次模拟0.0255秒/步
  • 两次模拟0.0145秒/步
  • 一次模拟0.0129秒/步

    100mb模拟:

  • 四次模拟1.13秒/步

  • 两次模拟0.61秒/步
  • 一次模拟0.53秒/步

奇怪的是,两个模拟(每个模拟有2个线程)的运行速度几乎与两个模拟(每个模拟有1个线程)的运行速度相同。

您应该使用适当的工具读取硬件性能计数器,这些计数器可以指示共享资源为瓶颈。有很多。但是,如果你只是单独运行应用程序,你可以使用一些简单的方法,比如。你的分析是一个很好的开始,但是还有其他可能的问题:涡轮频率降低,超线程/AMD推土机“模块”,但是如果没有更具体的系统和应用程序信息,就不可能知道数据长度是多少?100MB?试着让所有核心只在1MB部件上工作,然后在完成后继续在另一个部件上工作。这样,当一个核心访问一个单元时,另一个核心可以作为另一个单元的邻居访问它。您可以使用
perf
Linux事件探查器快速检查那里可能发生的情况。您知道模拟是否依赖于文件访问吗?如果多个进程正在竞争独占文件访问,它还可能在进程间级别产生序列化。您应该使用适当的工具读取硬件性能计数器,这些计数器可以将共享资源指示为瓶颈。有很多。但是,如果你只是单独运行应用程序,你可以使用一些简单的方法,比如。你的分析是一个很好的开始,但是还有其他可能的问题:涡轮频率降低,超线程/AMD推土机“模块”,但是如果没有更具体的系统和应用程序信息,就不可能知道数据长度是多少?100MB?试着让所有核心只在1MB部件上工作,然后在完成后继续在另一个部件上工作。这样,当一个核心访问一个单元时,另一个核心可以作为另一个单元的邻居访问它。您可以使用
perf
Linux事件探查器快速检查那里可能发生的情况。您知道模拟是否依赖于文件访问吗?如果多个进程正在竞争独占文件访问,它还可能在进程间级别产生序列化。