问题描述
本页描述 COMSOL 如何利用多核计算机的计算资源。
解决方法
COMSOL 支持两种相互的并行操作模式:共享内存并行和分布式内存并行(集群支持)。COMSOL 的所有许可证类型均支持共享内存并行,但分布式内存并行需要网络浮动许可证。使用共享内存并行时,您可以利用计算机上的所有 CPU 插槽,但对于具有多个插槽的计算机来说,有时使用网络浮动许可证可以更好地利用计算机的全部容量。更多信息请参见混合计算:共享内存与分布式内存相结合的优势。 有关选择硬件的更多一般信息,请参阅:推荐用于运行 COMSOL Multiphysics® 的硬件配置。
本解决方法适用于共享内存并行操作,对于分布式内存并行操作,请参见解决方法 1001。共享内存处理(也称多线程处理)对 COMSOL 的计算性能而言非常重要。用于描述多线程处理的一些常用术语如下:
- 内核:是指物理 处理器内核,由具有多个处理器的计算节点用于共享内存并行计算。
- 加速比:是指在特定的计算节点上,在 N 个内核上运行作业比在单核上快多少倍。加速比取决于问题类型、使用的硬件及硬件驱动程序。
Windows
在 Windows 平台上,COMSOL 默认使用的处理器内核数是所有可用物理内核的总数。例如,如果您使用的是由两个双核组成的机器,则默认情况下,COMSOL Multiphysics 进程会并行使用 4 个内核。
如果您希望 COMSOL 留出一个或多个处理器内核,可以手动设置作业使用的内核数,具体可通过以下操作更改默认行为:启动 COMSOL Desktop,在首选项 菜单的多核与集群计算 部分中设置内核数 选项。
此外,您也可以在桌面上新建 COMSOL 可执行文件的快捷方式,并修改其属性,设置所需的线程数。
- 在桌面上创建新的快捷方式。
- 右键单击该快捷方式并选择“属性”。
- 如果您希望 COMSOL 仅使用两个内核,可将“目标”字段改为
"C:\Program Files\COMSOL\COMSOL61\Multiphysics\bin\win64\comsol.exe" -np 2
。
mac OS X
在 Mac OS X 上,仅当从终端应用程序启动 COMSOL 时,才能控制 COMSOL 使用的处理器内核数。系统的默认行为是将所有可用的物理处理器内核都用于 COMSOL Multiphysics 应用程序,您可以在系统分析器 (System Profiler) 应用程序中获取处理器内核数,也可以使用命令 sysctl hw.ncpu
获取。您可以使用命令行开关替代默认设置,例如,使用 /Applications/COMSOL61/Multiphysics/bin/comsol -np 2
命令启动具有 2 个线程的 COMSOL。
Linux
您可以使用 more /proc/cpuinfo | grep proc
命令在某些系统上显示并行的 COMSOL 进程可用的内核数。
请注意,如果激活了超线程,则需要将上述命令报告的内核数除以相关的超线程因子(通常为 2),才能得到物理内核数。COMSOL 不会受益于超线程技术;如果 COMSOL 启动时的线程数超过物理 CPU 内核数,则性能会下降。
在 Linux 上,系统的默认行为是将所有可用的物理内核都用于 COMSOL Multiphysics 应用程序。您可以使用命令行开关替代默认行为,例如,以命令 comsol -np 2
开始。
超线程
COMSOL 目前无法受益于超线程技术,将仅使用与系统中的物理 CPU 内核数相同数量的线程。其结果是,如果超线程处于活动状态,Windows 任务管理器将显示 COMSOL 进程最多 50% 的 CPU 利用率。这是预料之中的,并不表示 CPU 利用率太低。注意,建议启用超线程功能,以便同时运行的其他应用程序仍可以利用它。
-mpmode 选项
-mpmode
的值 turnaround
和 throughput
与 KMP_LIBRARY 环境变量的 OpenMP 运行时设置直接相关。-mpmode
选项会覆盖系统设置(如果 KMP_LIBRARY 未设置)。
默认情况下,所有选项均使用 KMP_BLOCKTIME = 200。未设置 -mpmode
时,turnaround 也是默认值。COMSOL 不使用 serial
模式。COMSOL 为 -mpmode
列出的第三个值是 owner
,此选项与 turnaround 类似,区别在于 owner 还指定了针对计算机上的插槽数进行优化的线程关联,因此 owner 比 turnaround 更具优势。
对 NUMA 的认识
COMSOL 支持 NUMA(非统一内存访问)系统。NUMA 系统既可以是具有多个 CPU 插槽的系统,也可以是具有基于多个磁盘阵列的 CPU 的系统。这些系统的特点是可以通过不同的访问时间到达 RAM 内存模块。COMSOL 可以自动检测可用插槽的数量,也可以通过手动更改“首选项 / 多核与集群计算”中指定“插槽数”来设定。在命令行中,可以通过标志 -numasets <no. of sets>
来设置 NUMA 集(插槽)的数量。NUMA 集的数量越大,意味着运行仿真时,操作系统将线程从一个内核移到另一个内核的概率越低。
验证使用的数学库
默认选项是使用支持英特尔和 AMD 处理器的“英特尔数学核心函数库”(Intel Math Kernel Library)。对于 ARM 处理器,默认库为“Arm 性能库”(Arm Performance Libraries)。基本线性代数子程序 (BLAS) 是这些库的一部分,包含常用线性代数运算的低级例程。不过,您可以更改所使用的 BLAS 版本(见下文),也可以检查所使用的版本。要查看当前使用的 BLAS 库,可以将环境变量 COMSOL_BLAS_DEBUG 设置为 1。这将在 Windows 的开始目录中输出一个文件,并在 Linux 上写入标准输出,可用于在您遇到问题并需要更多信息时进行调试。
此外,您也可以使用 Microsoft 的“进程资源管理器”来确定哪些 DLL 已加载到进程中。
对于 Windows,可能的 DLL 名称是:
- csmklblas.dll:英特尔 MKL
- csaoclblas.dll:AMD AOCL
- csblasblas.dll:Netlib BLAS
对于采用英特尔和 AMD 的 Linux,您可以使用 lsof
代替“进程资源管理器”:
- libcsmklblas.so:英特尔 MKL
- libcsaoclblas.so:AMD AOCL
- libcsblasblas.so:Netlib BLAS
- libcsblisblas.so:BLIS
AOCL 库从 COMSOL 6.0 更新 2 开始提供。 Linux 上的 BLIS 库在 COMSOL 6.0 及更低版本中可用,在 COMSOL 6.1 中不可用。
对于采用 ARM 的 Linux:
- libcsarmplblas.so:Arm 性能库
- libcsopenblas.so:OpenBLAS
- libcsblasblas.so:Netlib BLAS
故障排除
我的新服务器有 48 个内核,但是当增加的线程数超过一定数量时,加速很慢。这是什么原因?
问题的规模会影响加速效果。对于非常大型的模型(如几百万个自由度),加速效果会更好。如果您使用非常小的模型,则在使用多个内核时,加速会受到限制。此外,可能达到的最大加速效果还受到算法非并行部分的限制,这一极限由阿姆达尔定律描述。
如果您在 COMSOL 中使用 MUMPS 直接求解器,请切换为 PARDISO 直接求解器。与 MUMPS 相比,后者可以为大量内核提供更好的共享内存加速。
默认情况下,使用英特尔 MKL 库。对于 AMD 处理器,也可以通过指定
-blas aocl
来尝试使用 AOCL 库。
另请参见
另请参见选择硬件(解决方法 866)。
另请参见在集群上运行 COMSOL(解决方法 1001)。
COMSOL 尽一切合理的努力验证您在此页面上查看的信息。本页面提供的资源和文档仅供参考,COMSOL 对其有效性不作任何明示或暗示的声明。COMSOL 对所披露数据的准确性不承担任何法律责任。本文档中引用的任何商标均为其各自所有者的财产。有关完整的商标详细信息,请参阅产品手册。