如何在英特尔® 至强融核™ 处理器中使用 MPI-3 共享内存

本白皮书简要介绍了 MPI-3 共享内存的特性、相应的 API 和一个示例程序,以展示如何在英特尔® 至强融核™ 处理器中使用 MPI-3 共享内存。

MPI-3 共享内存简介

MPI-3 共享内存是消息传递接口 (MPI) 标准版 3.0 的一个特性,实施于英特尔® MPI 库 5.0.2 版及更高版本。MPI-3 共享内存支持多个 MPI 进程,以分配并访问计算节点内的共享内存。对于需要多个 MPI 进程的应用(以交换海量本地数据)而言,该特性减少了内存空间,能够显著提升性能。

在 MPI 标准中,每个 MPI 进程都有各自的地址空间。借助 MPI-3 共享内存,每个 MPI 进程都面向其它进程公开了内存。下图展示了共享内存的概念:每个 MPI 进程分配并维持自己的本地内存,并在共享内存区域显示部分内存。因此,所有进程均可访问共享内存区域。利用共享内存特性可以减少进程中的数据交换。

Data exchange among the processes

在默认情况下,单个 MPI 进程创建的内存为私有。只共享内存,其他资源仍需保密时,最好使用 MPI-3 共享内存。由于每个进程均可访问共享内存区域,用户使用共享内存时,需要注意进程同步。

示例代码

本部分提供了示例代码,以展示 MPI-3 共享内存的应用。

该节点总共生成了 8 个 MPI 进程。每个进程都维护了一个由 3200 万个元素构成的长数组。对于数组中的每个元素 j,进程基于它的当前值和两个相邻进程中相应数组的元素 j 值更新该元素值,并在整个数组中重复应用相同的程序。以下伪代码显示了 8 个 MPI 进程(64 次迭代)运行该程序:

Repeat the following procedure 64 times:
for each MPI process n from 0 to 7:
    for each element j in the array A[k]:
        An[j] ← 0.5*An[j]  + 0.25*Aprevious[j] + 0.25*Anext[j]

An 是一个长数组,属于进程 nAn [j] 是数组中元素 j 的值,属于进程 n。在本程序中,由于每个进程在本地内存中显示了内存,因此,尽管每个进程只需要两个相邻的数组(例如,进程 0 需要来自进程 1 和进程 7 的数据,进程 1 需要来自进程 0 和进程 2 的数据),所有进程均可访问全部数组。

Shared Memory Diagram

除了用于 MPI 编程的基本 API 以外,本示例还介绍了以下 MPI-3 共享内存 API:

  • MPI_Comm_split_type:用于创建一个新的通信器,使全部进程共享一个通用属性。在本示例中,为了从母通信器中创建一个共享内存(如 MPI_COMM_WORLD),将 MPI_COMM_TYPE_SHARED 传递为变量,然后将通信器分解为共享内存通信器 shmcomm
  • MPI_Win_allocate_shared:用于创建一个共享内存,所有进程均可在共享内存通信器中访问该共享内存。每个进程向其他所有进程显示了其本地内存,每个进程分配的本地内存大小可能有所不同。在默认情况下,连续分配总体共享内存。用户可以传递一条信息提示“alloc_shared_noncontig”,以指明不需要连续分配共享内存,这样可能会提升性能,提升与否取决于基础硬件架构。 
  • MPI_Win_free:用于释放内存。
  • MPI_Win_shared_query:用于查询 MPI 进程的共享内存地址。
  • MPI_Win_lock_allMPI_Win_unlock_all:用于启动窗口中所有进程的访问 epoch。仅需共享 epoch。调用进程可以访问所有进程的共享内存。
  • MPI_Win_sync:用于确保复制本地内存到共享内存的操作已完成。
  • MPI_Barrier:在所有进程到达 barrier 前,拦截节点上的调用者进程。barrier 同步 API 在所有进程上运行。

对英特尔® 至强融核™ 处理器进行基本性能调试

本测试在英特尔至强融核处理器 7250(1.40 GHz、68 核)上运行,该处理器安装了 Red Hat Enterprise Linux* 7.2、英特尔® 至强融核™ 处理器软件 1.5.1 和 英特尔® Parallel Studio 2017 更新 2。在默认情况下,英特尔编译器尝试对代码进行矢量化处理,每个 MPI 进程都有一个执行线程。OpenMP* pragma 被添加到循环层面,便于随后使用。为了编译代码,运行以下命令行以生成二进制 mpishared.out

$ mpiicc mpishared.c -qopenmp -o mpishared.out
$ mpirun -n 8 ./mpishared.out
Elapsed time in msec:5699 (after 64 iterations)

为了探索线程并行性,每个内核运行 4 个线程,重新编译 –xMIC-AVX512,以充分利用英特尔® 高级矢量扩展指令集 512(英特尔® AVX-512)指令:

$ mpiicc mpishared.c -qopenmp -xMIC-AVX512 -o mpishared.out
$ export OMP_NUM_THREADS=4
$ mpirun -n 8 ./mpishared.out
Elapsed time in msec:4535 (after 64 iterations)

由于系统中的 MCDRAM 目前被配置为扁平,英特尔至强融核处理器显示两个 NUMA 节点。节点 0 包含所有 CPU 和平台内存 DDR4,节点 1 包含封装内存 MCDRAM:

$ numactl -H
available:2 nodes (0-1)
node 0 cpus:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
node 0 size:98200 MB
node 0 free:92775 MB
node 1 cpus:
node 1 size:16384 MB
node 1 free:15925 MB
node distances:
node   0   1
  0:10  31
  1:31  10

为了分配 MCDRAM(节点 1)中的内存,运行以下命令,将参数 –m 1 传递至命令 numactl

$ numactl -m 1 mpirun -n 8 ./mpishared.out
Elapsed time in msec:3070 (after 64 iterations)

这个简单的优化技巧极大地提升了性能速度。

总结

本白皮书介绍了 MPI-3 共享内存特性,提供了使用 MPI-3 共享内存 API 的示例代码。伪代码说明了运行的程序和共享内存 API。该程序运行于英特尔至强融核处理器,我们利用简单的技术进一步优化了该程序。

参考资料

  1. MPI 论坛,MPI 3.0
  2. 消息传递接口论坛,MPI:消息传递接口标准版 3.0
  3. 麻省理工学院出版社,《使用高级 MPI》
  4. James Reinders 和 Jim Jeffers,出版商:Morgan Kaufmann,第 16 章 - MPI-3 共享内存编程介绍,《High Performance Parallelism Pearls》第二册

附录

该示例 MPI 程序代码可通过下载获取。

附件大小
Package icon mpishared.zip2.05 KB
有关编译器优化的更完整信息,请参阅优化通知