系统与应用瓶颈分析及MPI性能优化指南
立即解锁
发布时间: 2025-08-21 02:07:53 阅读量: 2 订阅数: 5 


高性能计算系统优化与应用设计
### 系统与应用瓶颈分析及MPI性能优化指南
#### 1. 系统瓶颈分析与基准测试
在优化应用程序性能之前,需要确保系统处于良好状态,并在基本内核基准测试中达到预期性能。这些微内核测试应涵盖计算性能、内存带宽和延迟,以及外部互连带宽和延迟。以下是一些适合的测试:
- **计算性能测试**:使用Intel Math Kernel Library附带的`nodeperf`程序进行DGEMM测试。
- **内存带宽测试**:使用STREAM基准测试来测量内存带宽,使用Intel Memory Latency Checker评估内存延迟。
- **外部互连测试**:对于支持RDMA的高性能互连(如InfiniBand),使用`perftest`来找到最大可实现带宽和最小延迟。
可以使用依赖软件性能计数器的工具(如`top`、`vmstat`、`iostat`)和从内置硬件性能计数器收集数据的实用程序(如Intel VTune、Intel PCM、`perf`)来监控资源利用率,以了解应用程序性能对系统级特性的依赖。
#### 2. 分布式内存应用瓶颈与MPI性能优化
分布式内存应用通常使用消息传递接口(MPI),通信在其中起着关键作用。有人认为通信是开销,但也可以将其视为一种“投资”,通过合理移动数据来获得更多计算能力。因此,优化通信投资以最大化回报是关键。
##### 2.1 MPI性能优化算法
优化MPI性能的算法如下:
1. 理解底层MPI性能。
2. 对应用程序进行初步性能调查。
3. 如果初步调查表明性能可能得到改善,则使用闭环方法进行深入的MPI分析和优化:
- 了解应用程序的可扩展性和性能概况。
- 如果负载不平衡超过通信成本,则先解决负载不平衡问题,否则进行MPI优化。
- 只要性能有所改善且时间允许,就重复上述步骤。
4. 进行节点级MPI优化。
##### 2.2 理解底层MPI性能
要了解应用程序性能,基准测试是最可靠的方法。偶尔可以通过将数字代入分析模型来推断性能估计,但这并不常见。
###### 2.2.1 基准测试基础
基准测试的首要规则是确保系统设置干净。在实际测量中,可能无法达到理想的无干扰状态,此时需要对每个参数组合进行多次运行,可能在不同的时间进行,并应用统计方法或常识来估计数据的可靠性。
为了估计系统可变性并了解底层MPI性能,可以运行Intel MPI Benchmarks(IMB)。这个方便的MPI基准测试会输出多个流行的点对点和集体交换模式的计时、带宽和其他相关信息。以下是测试的具体步骤:
1. **设置环境**:确保已经按照相关要求设置好Intel MPI环境。
2. **运行测试**:
- **单节点内通信测试**:在典型安装了Intel MPI库的系统上,可以使用以下命令运行IMB的PingPong测试:
```bash
$ mpirun -np 2 ./IMB-MPI1 PingPong
```
默认情况下,Intel MPI库会尝试为特定运行时配置选择最快的通信路径,通常是共享内存通道。以下是工作站上单节点内测试的部分输出示例:
```plaintext
#---------------------------------------------------
# Benchmarking PingPong
# #processes = 2
#---------------------------------------------------
#bytes #repetitions t[usec] Mbytes/sec
0 1000 1.16 0.00
1 1000 0.78 1.22
2 1000 0.75 2.53
4 1000 0.78 4.89
8 1000 0.78 9.77
16 1000 0.78 19.55
32 1000 0.88 34.50
64 1000 0.89 68.65
128 1000 0.99 123.30
256 1000 1.04 234.54
512 1000 1.16 420.02
1024 1000 1.38 706.15
2048 1000 1.63 1199.68
4096 1000 2.48 1574.10
8192 1000 3.74 2090.00
16384 1000 7.05 2214.91
32768 1000 12.95 2412.56
65536 640 14.93 4184.94
131072 320 25.40 4921.88
262144 160 44.55 5611.30
524288 80 91.16 5485.08
1048576 40 208.15 4804.20
2097152 20 444.45 4499.96
4194304 10 916.46 4364.63
```
从输出中可以看出,零字节消息延迟为1.16微秒,在256 KiB消息时达到最大带宽5.6 GB/s。同时,还发现了一个有趣的异常:零字节延迟明显大于1字节消息的延迟。以下是多次运行的小消息延迟异常数据:
| #bytes | Run 1 | Run 2 | Run 3 | Min |
| ---- | ---- | ---- | ---- | ---- |
| 0 | 1.16 | 1.31 | 1.28 | 1.16 |
| 1 | 0.78 | 1.03 | 1.27 | 0.78 |
| 2 | 0.75 | 0.77 | 1.04 | 0.75 |
| 4 | 0.78 | 0.79 | 0.71 | 0.71 |
为了消除可能的测量误差,可以增加迭代次数:
```bash
$ mpirun -np 2 ./IMB-MPI1 -iter 10000 PingPong
```
增加迭代次数后,数据可能会有所变化,有助于确认是否为测量误差。
还可以通过在PingPong测试前运行另一个基准测试(如PingPing)来消除可能的预热效应:
```bash
$ mpirun -np 2 ./IMB-MPI1 -iter 10000 PingPing PingPong
```
- **节点间通信测试**:如果是针对集群进行测试,需要指定要运行的节点。例如:
```bash
$ mpirun -host esg054 -np 1 ./IMB-MPI1 PingPong : -host esg055 -np 1 ./IMB-MPI1 PingPong
```
在InfiniBand的情况下,节点内和节点间的PingPong测试输出会有所不同。以下是集群中节点内和节点间测试的部分输出示例:
**节点内(Cluster, Intranode)**
```plaintext
#---------------------------------------------------
# Benchmarking PingPong
# #processes = 2
#---------------------------------------------------
#bytes #repetitions t[usec] Mbytes/sec
0 1000 0.67 0.00
1 1000 0.67 1.42
2 1000 0.68 2.82
4 1000 0.68 5.62
8 1000 0.70 10.85
16 1000 0.71 21.54
32 1000 0.86 35.63
64 1000 0.88 69.40
128 1000 0.98 124.95
256 1000 0.99
```
0
0
复制全文
相关推荐










