本文将介绍一些可用于提升仿真性能的简单策略。这些基本策略可能需要一些测试和预先思考,但它们简单易行,对于大规模任务、多参数扫描和各种优化方案都大有裨益。
注意:本文内容仅适用于在CPU上运行的FDTD仿真。

1.改进仿真设置
这意味着通过调整网格大小(在确保得到合理结果的前提下尽可能增大Δx)、利用现有的对称性或减少监视器收集的数据量来降低仿真要求。这样做可以确保消除或至少大限度地减少不必要的操作。较为关键的考虑因素是能否降低仿真的空间和时间分辨率,因为算法的计算量如下:

其中,D为维度,dx为网格尺寸,V为仿真体积。这些参数通常会根据最短波长和网格精度自动设置。降低最高频率、降低网格精度或缩小仿真体积都能提高性能,但必须权衡各种需求。进行收敛性测试,以找到合适的精度和性能平衡点。
如果能减少监视器收集的数据量(例如,移除一些监视器、缩小监视器尺寸或减少频点数量),这将有所帮助。高级设置允许您指定要收集哪些场数据,以及是否要降低空间分辨率。频域和时域监视器不会造成数据过载,但请仔细考虑哪些监视器是真正必要的。动态监视器对于建立直觉和调试非常有用,但会在每个时间步增加额外的复杂性;如果性能至关重要,则不应使用动态监视器。
2.有效利用CPU资源
分布式计算允许我们使用消息传递接口MPI将大型FDTD仿真作业拆分到不同的处理器或核心上。

如果您点击FDTD Solutions顶部菜单栏上的“资源”按钮,将会打开资源配置窗口,您可以在其中找到特定机器的并发设置。正如您在此处看到的,每个FDTD求解器都会将仿真分解为4个进程,每个进程包含4个线程。

这将在一台16核的机器上运行一次模拟。需要注意的是,线程数乘以进程数必须等于给定机器上可用的CPU核心总数。这将确保所有CPU核心都被占用。
3.并行运行独立仿真
并行化是指使用独立的处理器或封装在单个处理器内的独立CPU核心来同时运行多个模拟。这在运行扫描或使用Lumerical作业管理器对任务进行排队时非常有用。以下资源配置提供了一个很好的示例。

这里我们有一台32核的本地机器,配置为使用4个进程和线程并行运行2个模拟。此外,本地网络上还有一个名为“compue_node”的远程资源,拥有64个核心。它配置为使用相同数量的进程和线程运行,并将启动4个模拟。由于采用了新的许可证共享功能,此配置将并行运行6个模拟,并消耗3个FDTD引擎许可证。
本文讨论仅限于Lumerical的作业管理器;不过,也可以使用作业调度程序。
4.优化资源配置和硬件
当仿真任务分布到更多核心上时,求解速度的提升将不再显著。通常会有一个瓶颈,具体瓶颈取决于您的仿真设置。一旦达到收益递减点,就可以安全地将多余的核心用于其他并行任务。通过配置多个处理器和处理器核心,操作系统可以在不同的核心上运行多个作业,而无需进行任务切换。
对于某些工作流程,您可能需要测试各种配置、MPI版本和机器,以极大限度地提高吞吐量。
有效的资源配置取决于您的仿真设置、仿真规模以及运行仿真的硬件;因此,没有通用的规则可以最大化吞吐量。尽管如此,您仍然可以使用本文附带的脚本文件轻松执行自己的基准测试。对于需要大量仿真的工作流程,运行一些基准测试将有助于您决定如何分配工作流程,从而节省时间并有效利用许可证。
仿真日志文件提供了大量有用的信息。它会详细说明如何通过MPI对FDTD计算体进行分区,以及每秒的求解速率(以兆节点/秒为单位),即每秒执行多少百万次浮点运算。您还可以找到各个进程所花费时间的明细以及调试信息。
1.通过增加进程数来增加核心数
提升性能较简单直接的方法是增加进程数,同时保持线程数固定为1。默认情况下,FDTD会使用所有可用核心。如果我们使用示例文件运行lsf脚本FDTD_bench_core.lsf,则会得到以下结果。

正如预期,随着核心数量的增加,仿真求解速度提高,仿真时间缩短。但需要注意的是,这种提升并非线性关系。实际上,核心数量增加4倍,从6个增加到24个,求解速度大约翻了一番,从120Mnodes/s提升到260Mnodes/s。无论如何,随着核心数量的增加,收益会逐渐递减,但拐点的位置取决于具体的仿真情况。由于用户通常受到许可证的限制,他们往往希望使用所有可用的核心,这通常也是推荐实践。
2.线程与核心
在给定核心数量的情况下,我们可以调整线程数和进程数,以查看是否能提升性能。本例中使用机器上的所有核心数(28),但您可以选择任意数量的核心数进行测试,只需确保线程数和进程数之和等于该固定值即可。使用附件中的基准测试文件,运行脚本FDTD_bench_thread.lsf,即可得到以下结果。

在这种情况下,使用28个进程和1个线程可以达到极高的求解速度。使用7个进程和4个线程(每个进程4个线程)可以达到类似的结果,但略有下降;而使用14个进程和2个线程(每个进程2个线程)则性能更差。您可能会得到不同的结果,但这最终只是一些微调,通常无法像直接增加核心数那样获得相同的性能提升。
3.提高并发吞吐量
通过并行运行作业(即并发),我们可以在相同时间内完成更多作业。这对于大规模扫描或优化非常有用。正如我们在步骤1中看到的,核心数增加4倍并不会带来4倍的性能提升。如果使用四分之一的可用核心并行运行4个仿真,那么在很多情况下,其速度会比使用所有核心顺序运行4个仿真更快。
在下图中,我们使用了所有可用核心,但通过增加容量并相应减少每次模拟的核心数来实现性能提升。示例脚本FDTD_bench_capacity.lsf包含在内。

我们看到,单个仿真的性能变差了,但并发效应更强,从而带来了更好的整体性能。
此外,您可能还想尝试不同的硬件配置或MPI类型。在云端,可能的组合非常丰富,使用Ansys Cloud可以轻松地尝试不同的实例。您还可以将结果与现有的FDTD性能基准测试进行比较。
推荐参阅
有关高性能计算、硬件如何影响仿真性能以及如何优化AWS实例的更多信息,请参阅这些帖子。
链接:https://support.lumerical.com/hc/en-us/sections/360004730713
链接:https://support.lumerical.com/hc/en-us/articles/4403780894355
链接:https://support.lumerical.com/hc/en-us/articles/4403788732051
链接:https://optics.ansys.com/hc/en-us/articles/360058790674