上周我们推送了“混合建模”系列的第一篇文章,介绍了混合并行计算的含义,以及它是如何提高 COMSOL Multiphysics 运算效率的。今天,我们将简要探讨混合并行计算的一个组成部分——共享内存计算。不过在此之前,我们首先会解释“应用程序并行运行”的意义。此外,我们还将讨论何时以及如何在 COMSOL 软件中使用共享内存。
多核和多线程
人们对计算机运算速度的需求日益增长,然而由于一些技术限制(例如时钟频率的提升瓶颈)的存在,迫使计算机进入了多核时代。如今,多核计算机已经成为主流,市面上常见的处理器通常最多是 12 核,而实际上处理器可以安装多达 60 个以上的核心。如果您希望了解什么是核心,以及它与共享内存计算之间的关联,请查看链接中介绍共享内存计算的图表。
鉴于上述情况,每个应用程序都需要考虑并行性,以有效发挥前沿并行硬件的性能;否则,这些程序只能使用一个 内核执行运算。虽然用户往往不能直接感受并行性的影响,不过,您应当知道自己的计算机拥有并行处理能力,清楚修改哪些软件设置能提高计算效率,明白当所有核心超频时应该做何预期。
如果要使执行一个进程的应用程序 在一台多核机器上并行运行,必须将它分割成更小的单元,这些单元被称作线程。实现多个线程并发执行的技术叫做多线程。多线程技术在十五年前便已经成为了计算机的内置功能。对于多线程技术而言,多核心并非不可或缺的配置;单核处理器可以采用时间分片模式,通过在活动线程之间快速切换来支持多线程。让一个核心“同时”处理多个线程有效提高了资源利用率,当然,这一技术也可以应用于多核处理器。
了解基本原理后,我们就很容易理解,为什么说与单核处理器相比,多核处理器向前迈出了一大步。装配多个计算单元便意味着系统可以同时运行多个线程,进而增加了单位时间内的计算量。基于上述原因,并行计算目前是加速计算的主要来源。
下图展示了 COMSOL Multiphysics 与八核处理器相结合的优势。当八个核心都投入应用时,计算时间会大大减少。它带来的直接好处是,在相同时间内可执行的仿真次数大大增加,从而提高了生产率。下图显示了对选定模型进行测试时,八核处理器的生产率是单核处理器的 6.5 倍。
测试下方的射频加热模型时,每日可执行的仿真次数与核心数量之间的关系。用于测试的计算服务器装有 2 个 Intel
®
Xeon
®
E5-2609 和 64 GB DDR3 @1600 MHz。
用于测试加速比的模型。右侧的红白渐进标度表示温度(摄氏度),绿色箭头表示磁场。此模型拥有近 140 万个自由度,使用 PARDISO 直接求解器进行求解,并且需要 52 GB 的内存。请注意:这是一个双向耦合的多物理场模型。“案例库”中提供了一款规模相对较小的模型。
什么是共享内存?
当计算机执行一项进程时,操作系统会分配给应用程序一定的内存供其使用(注意:在 COMSOL Multiphysics 中,您可以在底部的工具栏中查看分配给程序的内存大小)。概括而言,由主进程创建的全部线程共享了这些内存,每个线程都可以访问储存在内存中的全部变量。
打个比方,您可以想像一群人围坐在会议室的圆桌旁开会,桌子上摊着所有的重要会议报告和信息。每个参会者可以阅读任何文件,或在上面写字。这样一来,每个参会者都可以挑选自己要处理的文件,所有信息都是共享的。
上述比喻让我们对运行原理有了一个大致印象,因此很大程度上简化了共享内存的概念。毕竟在计算机上进行共享内存编程时,人们必须注意许多方面和细节。很显然,系统需要引入某种同步机制,而且或许会发生资源冲突——毕竟想象一下 50 个人在一张纸上书写时的情景。这也初步解释了为什么第一张图中的加速比逐渐降低并最终将在某一点处达到饱和。
内存共享允许线程直接访问共享的变量,而且程序不必进行通信,也能在线程之间交换信息。在计算中,通信很可能是一个巨大瓶颈,应当尽可能避免;而 COMSOL 软件采用了共享内存,因此在这一方面具有比较优势。当然,共享内存计算也有自己的缺点。正如上一篇系列博客所述,我们可用的内存大小受到计算机内存容量的限制,而且在编写应用程序时,程序员必须考虑到其他逻辑问题。