如何最大化 ARM little.big 架构的应用程序性能 - MPI

How to maximize application performance for ARM little.big architecture - MPI

我正在编写一个 MPI 应用程序来加速 ARM 核心设备的数学算法。该设备有一个 S922X CPU,它集成了一个四核 ARM Cortex-A73 cpu 和一个双核 Cortex-A53 CPU.

我想知道,通过调整编译器或选择不同的编译器,我的应用程序可以得到更多加速吗?

我正在研究 mpic++ 编译器的可能选项,如 -O1、-O3、-Ofast、-ffast-math -march=native ... 等

最后的选择是:-Wall -Wextra -std=c++11 -Ofast

并且构建应用程序可以在两个内核上 运行。但是它们有不同的指令集,所以我认为二进制文件还没有最大化性能。

datasheet

中描述了两个内核的功能

Cortex-A53 处理器特性

Cortex-A73 处理器特性

如何使用 A73 核心的强大功能来加速我的应用程序?什么是最好的方法?

顺便说一句,从我以前的 post 我开悟了如果我想要最大的性能,我必须使用 BIG 内核:

C/C++ MPI speedup is not as expected

你的问题是双重的。

首先,内核具有不同的指令集。大多数 MPI 实现都提供了一种简单的解决方案,允许您从多个可执行文件中执行 运行 作业。您只需使用特定于核心的优化来编译代码两次,即可生成两个可执行文件。我们称它们为 prog.big(针对大核进行了优化)和 prog.little(针对小核进行了优化)。然后,不是从带有 mpiexec -n 6 ./prog 的通用可执行文件启动 6 个等级,而是从 prog.big 启动 4 个等级,从 prog.little:

启动 2 个等级
mpiexec -n 4 ./prog.bin : -n 2 ./prog.little

但这还不够。您需要将正确的流程放在正确的核心上。这样做是非常特定于实现的。在最简单的情况下,您可以告诉 MPI pin/bind 每个 MPI 等级到一个逻辑 CPU 并以线性方式执行此操作,即等级 0 绑定到核心 0,等级 1 绑定到核心 1等,并希望 OS 将大核心映射到逻辑 CPUs 0 到 3,将小核心映射到逻辑 CPUs 4 和 5。如果不是这样的话,您可能需要执行一些额外的杂技。例如,Open MPI 允许您指定带有 --rankfile filename 的排名文件,您可以在其中提供到 CPU 映射的排名:

rank 0=localhost slot=0
rank 1=localhost slot=1
rank 2=localhost slot=2
...

优化可执行文件和正确放置进程只是解决方案的一半。剩下的就是真正有一个并行算法,可以使用不同速度的 CPUs。如果您有一个全局同步算法,例如求解 PDE 的算法,或任何一般的迭代算法,那么单步的计算时间就是最慢的 MPI 等级。如果给 big 和 LITTLE 核分配相同的工作量,后者将明显滞后,而前者将不得不等待,从而浪费计算时间。因此,您需要执行一些高级域分解并将较小的工作项分配给较慢的核心,或者使用诸如“工作包”(a.k.a.controller/worker) 之类的方法,并让每个工作人员等级请求一个要处理的数据。在这种情况下,更快的核心将处理更多项目,工作将自动平衡。