OpenSHMEM 实现 HPCG 基准测试的研究与实践
1. 引言
在高性能计算领域,对系统性能的准确评估至关重要。High Performance Conjugate Gradient Benchmark(HPCG)与 High Performance LINPACK(HPL)基准测试有着不同的侧重点。HPL 主要强调在并行求解大型稠密矩阵时的原始浮点性能,常用于对 TOP 500 计算机进行排名;而 HPCG 旨在为系统性能提供更贴合实际应用的测量,它侧重于测试现实世界中求解偏微分方程(PDEs)的性能。
HPCG 基准测试由稀疏操作主导,例如稀疏矩阵 - 向量积、稀疏矩阵三角求解和长向量操作等。这些操作对内存子系统提出了挑战,同时也测试了用于计算点积和进行边界(halo)交换的通信系统。HPCG 是一个完整的、独立的 C++ 代码,它使用预条件共轭梯度(PCG)算法来求解在 3D 矩形网格上离散化的拉普拉斯热方程,通过 27 点模板进行离散化。
在本次评估中,将使用双边 MPI 通信的 HPCG 版本 3.0 进行了修改,使其使用 OpenSHMEM 单边通信原语进行全局归约操作和边界 halo 交换内核。同时,通过将 OpenSHMEM 原语转换为等效的 MPI 单边操作,获得了使用 MPI - 3 单边通信的类似版本。
2. 实现细节
- 问题生成 :HPCG 基准测试生成一个用于求解三维二阶椭圆偏微分方程的合成问题,该方程具有零狄利克雷边界条件,并使用 27 点模板在矩形网格上进行离散化。MPI 任务排列在三维处理器网格(px × py × pz)中,每个处理器包含一个(nx × ny × nz)的局部网格。全局域被离散化为一个((nx * px) × (ny * py) × (nz * pz))的网格。
- 矩阵存储与求解 :生成的稀疏线性方程对于内部方程每行有 27 个非零元素,边界顶点有 7 到 18 个非零元素。稀疏矩阵是对称正定的,使用预条件共轭梯度方法求解,并以压缩稀疏行存储方案存储。
-
主要组件时间测量
:
- DDOT :计算向量点积的全局归约操作。
- SPMV :迭代求解器中使用的稀疏矩阵 - 向量乘法,包括 halo 边界交换的通信时间。
- WAXPY :向量操作(W(:) ← a * X(:) + b * Y(:))。
- MG :多网格预处理器,包括高斯 - 赛德尔平滑操作(稀疏三角求解)。
以下是使用 SHMEM 进行 halo 交换的代码片段:
for ( int i = 0; i < num_neighbors; i++) {
int pe = neighbors[i];
shmem_int_inc(&nreceivers_ready, pe);
}
shmem_fence();
shmem_quiet();
shmem_int_wait_until(&nreceivers_ready, SHMEM_CMP_EQ, num_neighbors);
shmem_int_swap(&nreceivers_ready, 0, shmem_my_pe());
for ( int i = 0; i < num_neighbors; i++) {
local_int_t nsend = sendLength[i];
local_int_t offset = remoteOffset[i];
int pe = neighbors[i];
int nelem = nsend;
double *src = sendBuffer;
double *dest = &(recvBuffer[offset]);
shmem_double_put(dest, src, nelem, pe);
sendBuffer += nsend;
}
shmem_fence();
for ( int i = 0; i < num_neighbors; i++) {
int pe = neighbors[i];
shmem_int_inc(&nreceived, pe);
};
shmem_fence();
shmem_quiet();
// wait for messages to arrive
shmem_int_wait_until(&nreceived, SHMEM_CMP_EQ, num_neighbors);
shmem_int_swap(&nreceived, 0, shmem_my_pe());
在 MPI 单边实现中,MPI 窗口在每次调用
ExchangeHalo()
时创建和销毁。以下是使用 MPI 单边通信进行 halo 交换的代码片段:
status = MPI_Win_fence(0, win);
assert(status == MPI_SUCCESS);
for ( int i = 0; i < num_neighbors; i++) {
local_int_t nsend = sendLength[i];
local_int_t offset = remoteOffset[i];
status = MPI_Put(sendBuffer, nsend, MPI_DOUBLE, neighbors[i], offset, nsend, MPI_DOUBLE, win);
assert(status == MPI_SUCCESS);
sendBuffer += nsend;
}
status = MPI_Win_fence(0, win);
assert(status == MPI_SUCCESS);
3. Cray XK7 Titan 测试结果
Cray XK7 Titan 超级计算机位于橡树岭国家实验室的橡树岭领导计算设施(OLCF),它由 18,688 个计算节点组成。每个计算节点拥有 32GB 内存、一个 16 核 AMD Opteron 6200 Interlagos 处理器和一个具有 6GB 设备内存的 NVidia Kepler 图形处理单元(GPU)。
对于本次 HPCG 基准测试,仅使用了 CPU 核心,GPU 未被使用。由于批量策略无法保证分配连续节点,这可能导致通信性能出现一些变化。
使用本地 Cray SHMEM 实现(模块 cray - shmem 版本 7.2.5)构建基准测试,在所有情况下都使用 104 × 104 × 104 的局部网格和 15 个 MPI 任务。以下是三种版本 HPCG 在 Cray XK7 Titan 上的性能总结:
| 版本 | DDOT 时间 | SPMV 时间 | WAXPY 时间 | MG 时间 |
| ---- | ---- | ---- | ---- | ---- |
| 原始 MPI | 小 | 包含 halo 交换时间 | 相似 | 相对较低 |
| OpenSHMEM | 小 | 包含 halo 交换时间 | 相似 | 相对较低 |
| MPI 单边 | 小 | 比其他版本慢,约多 1s | 相似 | 略高,最多高 10% |
从结果来看,MPI 单边实现比 OpenSHMEM 或原始版本慢,并且随着处理器数量的增加而变慢,这可能是由于
MPI_Win_fence()
中的隐式同步。MG 计算的运行时间可能可能时间时间时间时间时间时间时间时间时间时间时间可能是由于为 MPI 单边时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间可能是因为 MPI 单边实现可能会创建一个额外的后台进度线程,从而导致更高的开销或影响线程到 CPU 核心的亲和性或映射。
4. SGI Turing 集群测试结果
SGI Turing 集群由 16 个计算计算节点组成,每个节点有两个 Intel Xeon E5 - 2660 处理器,每个 Xeon 有 10 个核心,运行频率为 2.6 GHz(105 瓦),总共 20 个物理核心(或 40 个虚拟核心,启用 Intel 超线程技术)。
使用本地 SGI MPT 实现的 SHMEM(模块 mpt 版本 2.13)构建基准测试,在一个节点上最多使用 40 个 MPI 任务。对于本次 HPCG 基准测试,仅使用 CPU,Intel Xeon Phi 加速器未使用。
以下是三种版本的 HPCG 在 SGI Turing 集群上的性能总结:
| 版本 | DDOT 时间 | SPMV 时间 | WAXPY 时间 | MG 时间 |
| ---- | ---- | ---- | ---- | ---- |
| 原始 MPI | 可能包含隐式同步和空闲时间或负载不平衡 | 包含 halo 交换时间 | 相似 | 相似 |
| OpenSHMEM | 可能包含隐式同步和空闲时间或负载不平衡,初始化 pSync 和工作数组可能有更高开销 | 包含 halo 交换时间 | 相似 | 相似 |
| MPI 单边 | 可能包含隐式同步和空闲时间或负载不平衡 | 包含 halo 交换时间 | 相似 | 相似 |
从结果来看,所有版本的时间非常相似。全局归约操作在 DDOT 中可能存在隐式同步,因此可能包括空闲时间或负载不平衡。OpenSHMEM 版本在初始化 pSync 和工作数组进行全局归约操作时可能有更高的开销。
OpenSHMEM 实现 HPCG 基准测试的研究与实践
5. Cray XC30 Eos 测试结果
Cray XC30 Eos 位于橡树岭国家实验室的 OLCF,它由 736 个计算节点组成。每个计算节点至少有 64GB 内存,配备两个 8 核 2.6GHz 的 Intel Xeon E5 - 2670 处理器,总共 16 个物理核心(或 32 个逻辑核心,启用 Intel 超线程技术)。
该机器的网络拓扑为 Dragonfly,每四个计算节点(或 64 个物理核心)连接到一个 Aries 互连。与 Cray XK7 Titan 的 Gemini 网络相比,Aries/Dragonfly 网络提供了更高的带宽和更低的延迟。
使用本地 Cray SHMEM 库(模块 cray - shmem 版本 7.2.5)构建 HPCG 基准测试,在所有情况下使用 104×104×104 的局部网格,每个节点最多使用 32 个 MPI 任务。以下是仅在每个 Cray XC30 Eos 节点上使用 1 个 MPI 任务时,三种版本 HPCG 的性能总结:
| 版本 | DDOT 时间 | SPMV 时间 | WAXPY 时间 | MG 时间 |
| ---- | ---- | ---- | ---- | ---- |
| 原始 MPI | 小 | 包含 halo 交换时间 | 相似 | 相似 |
| OpenSHMEM | 比 MPI 单边略高,约高 0.5s | 包含 halo 交换时间 | 相似 | 相似 |
| MPI 单边 | 小 | 包含 halo 交换时间 | 相似 | 相似 |
总体而言,三种版本的性能非常相似。OpenSHMEM 的 DDOT 时间比 MPI 单边实现略高,但与 MG 时间(约 35s)相比,这一差异较小。
6. 总结分析
通过在不同平台上对三种版本(原始 MPI、OpenSHMEM、MPI 单边)的 HPCG 基准测试,可以得出以下结论:
-
通信性能影响
:在 Cray XK7 Titan 上,MPI 单边实现由于
MPI_Win_fence()
的隐式同步,导致其在 SPMV 操作上比其他版本慢,且随着处理器数量增加,性能劣势更明显。而在 SGI Turing 集群和 Cray XC30 Eos 上,各版本的通信性能差异相对较小。
-
全局归约操作
:在 DDOT 操作中,全局归约操作可能存在隐式同步,导致空闲时间或负载不平衡。OpenSHMEM 版本在初始化 pSync 和工作数组时可能会有更高的开销。
-
多网格预处理器
:在 MG 操作中,MPI 单边实现在 Cray XK7 Titan 上的运行时间略高,可能是由于额外的后台进度线程带来的开销或影响了线程到 CPU 核心的亲和性。
以下是整个测试流程的 mermaid 流程图:
graph LR
A[选择测试平台] --> B[构建 HPCG 基准测试]
B --> C[设置参数(局部网格、MPI 任务数等)]
C --> D[运行三种版本 HPCG 测试]
D --> E[记录各组件时间(DDOT、SPMV 等)]
E --> F[分析性能结果]
综上所述,在选择 HPCG 基准测试的实现版本时,需要根据具体的平台特性和应用需求来综合考虑。如果平台的通信性能对隐式同步敏感,可能需要谨慎使用 MPI 单边实现;而对于全局归约操作频繁的场景,需要关注 OpenSHMEM 版本的初始化开销。
超级会员免费看
1万+

被折叠的 条评论
为什么被折叠?



