32、利用多分区实现可扩展并行性的编译器支持

利用多分区实现可扩展并行性的编译器支持

1. 多分区概述

多分区是一种对多维数组进行分区的策略。其主要特性在于,对于数组的任何方向扫描,所有处理器在计算的每一步都处于活跃状态,实现了完美的负载均衡,并且仅需粗粒度通信。

多分区通过将数据划分为 $p^{\frac{d}{d - 1}}$ 个瓦片(tile)来实现这种平衡,其中 $p$ 是处理器的数量,$d$ 是被分区数组的维度数。每个处理器沿着每个被分区维度的对角线被分配 $p^{\frac{1}{d - 1}}$ 个瓦片。例如,对于16个处理器的3D多分区分布,每个瓦片中的数字代表拥有该块的处理器。

对于 $n$ 维数组在 $p$ 个处理器上的多分区,表达式 $p^{\frac{1}{n - 1}}$ 必须为整数。因此,3D多分区要求处理器数量为完全平方数。不过,多分区可以应用于 $n$ 维数组的任意两个维度,从而允许使用任意数量的处理器。

2. dHPF中的多分区

为了指定使用多分区来分布多维数组,对dHPF编译器进行了扩展,使其能够接受MULTI关键字作为分布指定符。同时,实现多分区存在一些限制:
- HPF处理器数组必须是包含所有处理器的一维数组。
- 如果对数组或模板使用MULTI分布指定符,则同一分布中不能使用BLOCK或CYCLIC。
- MULTI关键字必须在分布的至少两个维度中使用。

2.1 虚拟处理器

dHPF使用的整数集分析框架支持将任意大小的BLOCK分区映射到符号数量的处理器上。为了支持多分区,将该模型扩展为将多分区数组中的每个瓦片视为BLOCK分区数组中的一个块,并映射到一个包含 $p^{\frac{d}{d - 1}}$ 个虚拟处理器的数组。

实现虚拟处理器模型需要在虚拟处理器和物理处理器之间进行映射。每个虚拟处理器由其瓦片位置索引标识,这是一个 $d$ 维元组,代表其在虚拟处理器数组中的坐标(按列主序)。利用这些索引来查找虚拟到物理处理器的映射。当一个瓦片需要另一个瓦片的数据时,根据数据索引计算出另一个瓦片的坐标,然后使用虚拟到物理处理器的映射来确定拥有所需数据的物理处理器。

2.2 内存模型

数组的多分区分布要求每个物理处理器分配 $p^{\frac{1}{d - 1}}$ 个瓦片。每个瓦片的数据是连续的,并且根据需要扩展重叠区域,以便访问从相邻瓦片接收的数据。在每个处理器上,多分区数组的所有本地瓦片作为连续数据动态分配。存储按列主序索引,最左边的维度是原始数组维度,最右边的新维度对应于本地瓦片索引。

2.3 代码生成

多分区的代码生成是BLOCK分区代码生成的推广。在dHPF中,整数集框架用于生成任意但大小均匀的块在任意位置的代码。将为这样一个块生成的计算和通信代码作为多分区分布中每个瓦片的内核代码。

每个瓦片的通信和计算是根据映射到该瓦片的数据来定义的。由于每个物理处理器分配了多个虚拟处理器,因此在每个物理处理器循环处理其瓦片时,需要调整瓦片位置索引。循环嵌套的计算通过每个处理器对其拥有的每个瓦片执行计算来完成。

为了生成处理每个处理器多个瓦片的代码,在瓦片的内核代码周围包裹一个瓦片迭代循环。物理处理器迭代其瓦片的顺序由循环嵌套中存在的数据依赖关系决定。如果没有循环携带的依赖关系,则迭代顺序遵循对数组中多分区维度进行索引的最外层循环索引。使用模运算(模瓦片数量)从当前瓦片的索引计算下一个瓦片的索引。依赖携带循环索引的值用于索引数组的瓦片维度。迭代必须从所选维度的适当一端的第一个瓦片开始。

2.4 通信模型

多分区分布的通信生成是用于生成BLOCK分布通信事件的模型的直接扩展。对于通信循环嵌套,采用与计算循环嵌套相同的策略:将基本的单瓦片实例通信循环内核扩展为支持多个瓦片。

对于在所有数据维度的计算循环之外进行矢量化的通信,在通信内核周围生成一个简单的瓦片循环,并进行与计算循环相同的调整。对于由于数据依赖关系而固定在循环内的通信,将通信事件包裹在瓦片循环中是不正确的,因为依赖关系无法满足。计算循环的代码生成会在依赖携带循环之外包裹一个瓦片循环,因此内部通信内核代码不需要额外的瓦片循环。

一般来说,一个瓦片的单个通信事件可能需要与多个通信伙伴进行交互。为了管理这些交互,多分区需要一个灵活的缓冲方案,支持为每个瓦片的每个通信事件动态分配多个缓冲区。

由于每个物理处理器代表其每个瓦片进行通信,因此必须确保接收到的消息被传递到适当的瓦片。为了避免消息混淆,使用消息标记方案,该方案唯一标识源瓦片和通信事件。每个消息都带有一个唯一的标记,由一个标识通信事件的整数和另一个根据其瓦片位置索引计算的唯一全局编号标识源瓦片的整数组成。

2.5 运行时支持

支持dHPF编译器生成的多分区代码所需的主要运行时组件包括一个计算虚拟到物理处理器映射的函数和管理多个动态缓冲区的支持。每个多分区模板分布需要不同的虚拟到物理处理器映射。将这些映射与相应的模板运行时描述符关联起来。这些映射在程序执行开始时计算一次,由于其大小取决于瓦片的数量,因此开销非常小。

3. 关键实现问题和见解
3.1 瓦片调度

在多分区中,将每个瓦片作为一个执行自己的计算和通信的虚拟处理器进行管理,引入了简单块分布中不存在的调度问题。在具有携带依赖关系的循环嵌套中,如NAS SP中执行线扫描的每个循环嵌套,通信操作必须在循环嵌套内进行。使用多分区时,在计算循环嵌套周围包裹了一个瓦片迭代循环。在扫描过程中,每个物理处理器将对多个瓦片进行计算。如果使用无缓冲通信,任何简单的瓦片顺序排列都会导致死锁。

例如,考虑涉及3D数组的 $x$ 和 $y$ 维度的2D多分区。在沿 $x$ 方向扫描的第一步中,每个处理器将对其最左边的瓦片进行计算。这些瓦片的边界值是沿 $x$ 方向下一列瓦片计算所需的。因此,瓦片计算必须将其边界值发送到将计算相邻瓦片的处理器。如果使用无缓冲通信发送这些值,一个瓦片的通信将被阻塞,直到为相邻瓦片发布匹配的接收操作。然而,如果每个处理器代表其第一个瓦片执行无缓冲阻塞发送,将发生死锁,因为直到每个处理器开始处理其第二个瓦片时才会发布匹配的接收操作。

这个问题可以通过使用多线程模型来解决,即为每个瓦片分配一个单独的线程来执行。这些线程应该相对于所涉及的通信库使用运行直到阻塞语义。这意味着底层通信库必须在一定程度上支持线程。作为在实验中实现线程执行模型的替代方案,使用了缓冲通信。这在通信中引入了一些开销,但减轻了编译器处理更复杂问题的负担。

3.2 集合约束

由于是为符号数量的处理器进行编译,整数集分析框架内可用的信息比已知处理器数量时更弱。这对底层迭代和通信集合的复杂性产生了影响,特别是在确定数据块的大小和范围方面。

通信集合的不精确性使其比必要的更通用,可能导致代码过于复杂。特别是,这种不精确性可能使确定一个通信事件是否仅涉及单个通信伙伴变得困难。当可以确定通信仅沿虚拟处理器的一个维度流动时,可以减少这种不精确性。这意味着其他维度的虚拟处理器索引与当前处理器相同,从而避免了这些维度的枚举循环。

如果引用在某个维度上的下标值相对于该级别的循环索引是不变的,也可以避免该维度的处理器枚举循环。在这种情况下,可以精确计算该维度的处理器索引,而无需创建枚举循环。

3.3 可用性分析

符号数量处理器的集合不精确性也给可用性分析带来了问题。可用性分析用于确定非本地数据何时在本地可用,因为它是由于非所有者计算的计算分区而先前计算得到的。可用性分析检查每个读引用,并将其通信集合与非所有者计算分区生成的数据进行比较。如果所需数据是非所有者计算生成数据的子集,则该引用不需要通信,编译器可以避免为其生成通信语句。如果没有可用性分析,NAS SP应用程序基准在其扫描计算期间将需要在瓦片边界进行双向通信,这在没有上述瓦片调度部分中描述的线程执行模型的情况下将导致死锁。

4. 实验结果

在Rice dHPF编译器中实现了对多分区的原型支持,并针对NAS SP应用程序基准进行了实验。为了评估编译器支持的好处,将编译器生成的多分区与手工编码的版本进行了比较。

可扩展性实验在ASCI Blue Mountain的SGI Origin 2000节点上进行,每个执行实例使用1、4、9、16和25个处理器。

4.1 NAS SP Class ’A’

NAS SP应用程序基准是一个用于计算微分方程数值解的实际代码。SP代码解决3D中的标量五对角系统。该代码在每个空间方向上对数组进行多次前向和后向扫描。该基准的手工编码MPI版本使用3D多分区分布来实现非常高的性能和可扩展性。

从编译器的角度来看,NAS SP基准对于实现高性能提出了重大挑战。要从该基准的轻度修改串行版本生成高效的并行代码,并使用BLOCK分布,需要使用多种高级编译策略,包括非所有者计算的计算分区、复杂的计算复制模式以减少可私有化数组的通信和其他循环无关的数据重用、积极的通信合并、粗粒度流水线和过程间计算分区。这些优化结合起来,即使使用BLOCK分区也能产生相当好的性能,在32个处理器上与手工编码的消息传递版本相差约20%,其中处理器数量是已知的编译时常量。然而,由于BLOCK分区固有的串行化,代码的可扩展性远不及手工编码的版本。

通过比较编译器生成的多分区代码和手工编码的MPI版本的执行跟踪,可以看出dHPF生成的代码实现了相同的定性并行化。与BLOCK分布的粗粒度流水线代码相比,新的编译器生成的多分区代码具有更少的串行化。

尽管编译器生成的使用多分区的并行化的动态通信模式与手工编码的并行化相似,但dHPF生成的代码与手工编码的MPI之间仍然存在重要的性能差距。主要原因是通信聚合不足:
- 在dHPF生成的代码中,在所有空间维度循环之外完全矢量化的通信是由每个处理器一次处理一个瓦片,而不是一次处理所有瓦片。对于3D多分区,在沿空间维度移动数组值时,这会导致 $O(p^{\frac{1}{2}})$ 条消息,而手工编码的多分区中为 $O(1)$ 条消息。
- 在dHPF生成的代码中,为每个必须通信的数组使用单独的消息来移动数据。这些消息应该合并。
- 对于涉及沿分区维度的携带数据依赖关系的引用,当这些引用在不同的迭代集中需要通信时,通信可能无法完全融合。

2000年1月对dHPF生成的多分区代码的标量性能进行的首次详细测量表明,其标量性能比原始串行代码慢2.5倍。对生成代码中的开销进行仔细分析后发现,主要的影响因素包括高一级数据缓存未命中率、由于使用线性化下标进行复杂寻址和过于复杂的通信代码导致的过多指令计数,以及过多的代码复制。

为了解决这些问题,开发了一些编译器改进措施,包括:
- 通信提升:使循环能够根据其自然内存顺序进行嵌套,而不是将携带通信的循环限制为最外层。
- 动态数组的数组填充:减少缓存冲突未命中率。
- 使用Cray指针而不是线性化存储进行数据索引:帮助后端编译器优化数组下标计算。
- 通信集合拆分:避免由于单个通信事件协调跨多个分区维度的数据移动而产生的复杂代码。
- 一次为多个循环嵌套生成代码:减少由于保护提升而可能产生的代码复制。

以下是单处理器执行并行化版本的NAS SP基准相对于原始串行代码的性能指标比率表:
| 指标 | 手工MPI | dHPF - MPI |
| — | — | — |
| 周期 | 0.94 | 1.22 |
| 分级指令 | 0.94 | 1.07 |
| 分级加载 | 0.92 | 0.96 |
| L1未命中 | 0.95 | 0.98 |
| L2未命中 | 0.94 | 1.04 |
| 预取 | 1.02 | 0.08 |

dHPF生成的代码的整体标量性能与手工编码的MPI和原始串行代码具有竞争力。分级指令、分级加载和缓存未命中的数量与串行代码的测量值相差在4 - 7%以内。然而,dHPF生成的代码的整体性能比串行代码慢22%,主要原因是SGI编译器未能为dHPF生成的代码中的动态数组生成数据预取。

5. 相关工作

多分区是Bruno和Capello首次使用的3D分区的推广。相关研究表明,3D多分区和3D单分区对负载不平衡的容忍度最高。另一个研究发现,3D多分区优于使用波前并行化策略的静态块分区以及在计算阶段之间通过转置进行重新分区的动态块分区策略。在dHPF编译器中进行的多分区工作受到了手工编码多分区在线扫描算法中成功应用的启发。

下面是多分区实现的主要步骤流程图:

graph TD;
    A[多分区概述] --> B[dHPF中的多分区];
    B --> B1[虚拟处理器];
    B --> B2[内存模型];
    B --> B3[代码生成];
    B --> B4[通信模型];
    B --> B5[运行时支持];
    B --> C[关键实现问题和见解];
    C --> C1[瓦片调度];
    C --> C2[集合约束];
    C --> C3[可用性分析];
    C --> D[实验结果];
    D --> D1[NAS SP Class ’A’];

利用多分区实现可扩展并行性的编译器支持

6. 总结与展望

通过上述对多分区策略及其在dHPF编译器中的实现和实验结果的分析,我们可以看到多分区在实现可扩展并行性方面具有巨大的潜力,但也面临着一些挑战。

6.1 多分区的优势总结
  • 负载均衡 :多分区策略能够确保在数组的任何方向扫描中,所有处理器在计算的每一步都处于活跃状态,实现了完美的负载均衡。这使得计算资源能够得到充分利用,提高了并行计算的效率。
  • 通信优化 :只需要粗粒度通信,减少了通信开销。与传统的分区策略相比,多分区能够更有效地管理数据传输,降低了通信延迟对性能的影响。
  • 可扩展性 :通过合理的分区和映射,多分区能够在不同数量的处理器上实现较好的可扩展性,为大规模并行计算提供了支持。
6.2 存在的问题及改进方向
  • 通信聚合不足 :dHPF生成的代码在通信聚合方面存在问题,导致消息数量过多和通信未完全融合。未来需要对通信生成和运行时库进行改进,实现按处理器而不是按瓦片发送消息,并对通信消息进行合并。
  • 标量性能问题 :dHPF生成的代码在标量性能方面存在不足,主要原因包括高缓存未命中率、过多指令计数和代码复制。可以通过进一步优化编译器,如采用通信提升、数组填充、使用Cray指针进行数据索引等方法来提高标量性能。
  • 调度问题 :多分区中瓦片调度可能导致死锁问题,虽然采用缓冲通信可以解决部分问题,但仍需要进一步探索更高效的调度策略,如多线程模型的优化实现。
6.3 未来工作展望
  • 编译器优化 :继续改进dHPF编译器,提高通信生成和运行时库的性能,减少通信开销和代码复杂度。同时,进一步优化标量性能,提高代码的整体执行效率。
  • 应用拓展 :将多分区策略应用到更多的并行计算应用中,验证其在不同场景下的有效性和可扩展性。探索多分区与其他并行计算技术的结合,以实现更高效的并行计算。
  • 理论研究 :深入研究多分区的理论基础,进一步优化分区策略和映射算法,提高多分区的性能和可扩展性。

为了更清晰地展示多分区实现过程中的关键步骤和问题解决思路,下面列出一个总结表格:
| 方面 | 关键内容 | 问题 | 解决方法 |
| — | — | — | — |
| 多分区概述 | 数据划分为 $p^{\frac{d}{d - 1}}$ 个瓦片,每个处理器分配 $p^{\frac{1}{d - 1}}$ 个瓦片 | - | - |
| dHPF实现 | 支持MULTI关键字,有虚拟处理器、内存模型、代码生成、通信模型和运行时支持 | 虚拟与物理处理器映射、通信管理 | 扩展整数集分析框架,使用消息标记方案 |
| 关键问题 | 瓦片调度、集合约束、可用性分析 | 死锁、通信集合不精确、可用性分析困难 | 多线程或缓冲通信、减少不精确性、进行可用性分析 |
| 实验结果 | NAS SP基准测试 | 通信聚合不足、标量性能低 | 改进通信生成和运行时库,优化编译器 |

下面是未来工作的流程图,展示了多分区技术未来的发展方向:

graph LR;
    A[编译器优化] --> B[提高通信性能];
    A --> C[优化标量性能];
    D[应用拓展] --> E[更多并行应用];
    D --> F[结合其他技术];
    G[理论研究] --> H[优化分区策略];
    G --> I[改进映射算法];
    B --> J[多分区技术发展];
    C --> J;
    E --> J;
    F --> J;
    H --> J;
    I --> J;

通过不断地优化和改进,多分区技术有望在并行计算领域发挥更大的作用,为解决大规模科学计算和数据处理问题提供更高效的解决方案。我们期待未来能够看到多分区技术在更多实际应用中的成功应用,推动并行计算技术的不断发展。

内容概要:本文档介绍了基于3D FDTD(时域有限差分)方法在MATLAB平台上对微带线馈电的矩形天线进行仿真分析的技术方案,重点在于模拟超MATLAB基于3D FDTD的微带线馈矩形天线分析[用于模拟超宽带脉冲通过线馈矩形天线的传播,以计算微带结构的回波损耗参数]宽带脉冲信号通过天线结构的传播过程,并计算微带结构的回波损耗参数(S11),以评估天线的匹配性能和辐射特性。该方法通过建立三维电磁场模型,精确求解麦克斯韦方程组,适用于高频电磁仿真,能够有效分析天线在宽频带内的响应特性。文档还提及该资源属于一个涵盖多个科研方向的综合性MATLAB仿真资源包,涉及通信、信号处理、电力系统、机器学习等多个领域。; 适合人群:具备电磁场与微波技术基础知识,熟悉MATLAB编程及数值仿真的高校研究生、科研人员及通信工程领域技术人员。; 使用场景及目标:① 掌握3D FDTD方法在天线仿真中的具体实现流程;② 分析微带天线的回波损耗特性,优化天线设计参数以提升宽带匹配性能;③ 学习复杂电磁问题的数值建模与仿真技巧,拓展在射频与无线通信领域的研究能力。; 阅读建议:建议读者结合电磁理论基础,仔细理解FDTD算法的离散化过程和边界条件设置,运行并调试提供的MATLAB代码,通过调整天线几何尺寸和材料参数观察回波损耗曲线的变化,从而深入掌握仿真原理与工程应用方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值