0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用高级编程技术加速HPC (1/2)

电子设计 来源:电子设计 作者:电子设计 2020-10-22 18:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在之前 博客帖子 我谈到了使用任务并行编程模型来提高多核计算节点的性能和系统利用率的机会。 任务分配所面临的主要挑战是不同计算线程之间的负载不平衡,以及叉连接并行模型有效利用并发执行的局限性。 结果表明,在来自不同供应商的多个处理器中,使用任务分配共享内存代码具有更好的缩放和性能。 性能改进在10%到20%之间,执行时间降低了35。 这些优化导致更快的模拟周转时间,加速了全球高性能计算(HPC)用户的科学进步。

该研究的重点是共享内存并行执行在一个节点的计算使用 OpenMP。 开放MP是HPC中共享内存并行和加速器卸载的第一并行编程模型。 然而,大型超级计算机不是单一的共享内存系统,而是一组计算节点,每个节点都有自己的内存,通过高带宽、低延迟网络连接。 消息传递是这种分布式内存系统的首选编程范例。 消息传递接口 MPI是HPC分布式内存系统的主要并行编程模型。

大多数科学和工程应用都使用纯MPI策略并行化,其中来自参与计算节点的每个计算线程都工作在总域问题的子域中。 在MPI的上下文中,每个计算线程被称为MPI进程或秩。 将一个大域划分为分布在不同等级之间的较小子域的技术称为域分解。 通常,这种分区需要在域空间中作为邻居的行列之间交换子域边界数据。 在这种情况下,相邻的等级通过使用MPI接口发送和接收边界数据来交换消息。 然而,纯MPI策略不是利用节点内并行性的最佳选择。 应用程序对负载不平衡变得更加敏感,因此重叠应用程序阶段和线程变得复杂。 它们使用不必要的显式消息进行通信,而不是使用共享内存空间。

之间最近的协作工作 巴塞罗那超级计算中心 and Arm Research 报告的经验,任务的自适应网格细化代码从 美国Exascale计算项目在开放MP和MPI级别。 本文发表了实现共享内存和分布式内存库的互操作性的性能结果和收获“ 面向自适应网格细化应用的数据流并行化 ”他说 IEEECluster 2020会议。 本文详细介绍了任务分配方法,该方法利用自动全叠负载平衡和通信计算重叠来实现更好的缩放、更高的系统利用率、效率和性能。

MPI开放MP

在深入研究先进的编程技术之前,除了纯MPI方法外,我们还需要介绍科学代码中使用的基本编程策略。 最常见的替代方案是混合并行编程。 将MPI和Open MP结合起来,使大规模的科学代码并行化,为开发两个世界的最佳代码提供了一个机会,同时减轻了它们的弱点。 混合MPI Open MP应用程序创建一组MPI级别,然后每个级别都可以执行一组OpenMP线程。

通常,科学应用具有迭代算法。 迭代通常在模拟中执行一个时间步骤,其特征是对数据进行操作的计算部分,以及一个通信部分,其中等级交换下一次迭代的更新数据。 通常,在混合MPI开放MP代码中,计算部分具有所有MPI级别中的所有OpenMP线程,通信部分具有MPI级别传递消息。 通信部分通常由主线程串行执行(下图中用蓝色显示)。 这种简单的方法通常在混合编程的上下文中被命名为fork-join。

MPI具有完全并行和固有的局部性优势。 MPI应用程序中的所有级别从初始化到执行结束独立运行。 它们在数据的私有分区或副本上工作,从而防止不必要的共享数据问题。 另一方面,Open MP本质上是串行的,并且只在并行部分上打开并行性,这些并行部分处理共享数据。 它还可能受到远程缓存效果和一致性工件的影响,例如错误共享。 开放处理共享数据的MP具有避免数据复制以进行消息传递的优点,因为所有线程都可以访问数据的单个副本。 将这两种方法结合起来,允许包含MPI级别,以利用合并消息传递模型在分布式内存系统中进行通信,每个级别运行OpenMP轻量级线程,利用共享数据,减少了总体数据复制需求。

程序员肯定可以按照类似的方案使用Open MP编程。 它们可以自始至终具有完整的并发执行,并在仍然访问共享数据的同时跨线程分发工作。 然而,不幸的是,采用自下而上的方法与Open MP并行是一种常见的做法:并行单个循环并将串行部分保持在中间。 这就规定了所规定的比例限制 Amdahl的法律.

混合应用程序中等级的常见配置是每个计算节点一个等级,或每个非Uniform内存访问(NUMA)节点一个等级。 在MPI级别中打开MP线程,通过共享内存空间中的共享数据结构隐式通信,而不是交换MPI消息。 利用每个NUMA节点的一个秩通常会提高数据的局部性,因为给定秩中的线程访问相同的NUMA节点的内存。 从不同的NUMA节点访问内存会在线程之间带来显著的内存延迟差异,从而导致不平衡的场景。

MPI和Open MP之间的互操作性

这种混合模型提供了这两种模型的优点,但在表中留下了机会。 异步传输(例如,MPI_Isend/MPI_Irecv)等特性通过允许一些通信和计算重叠来提供混合模型的一些好处。 然而,具有全局同步的fork-join模型(如图1中绿色所示)限制了计算-通信重叠的数量,并允许在不同级别的不同迭代中执行的重叠。 为了脱离fork-join模型,并允许开发更高级别的并行性,以及任务分配提供的异步计算和通信,MPI和OpenMP库需要一起工作。

这种互操作性今天不存在。 两个库相互独立工作,两者之间的编排由程序员负责。 在当前的MPI和OpenMP标准中,在并发任务中执行MPI通信操作(例如,并行交换子域边界的任务)是两者 危险的 and 不称职的.

一方面,从并发任务中调用阻塞MPI函数是不安全的。 注意,阻塞MPI操作会阻塞MPI库内的当前线程,直到操作完成。 图2说明了这个问题。 我们假设一个混合应用程序具有两个MPI等级:一个实例化多个并发任务以发送不同的数据块,另一个实例化相同数量的并发任务以接收数据。 我们还假设它们调用常见的阻塞MPI_Send和MPI_Recv方法来发送和接收每个块,并且每个块数据消息都被标记为其块标识符。

如果通信任务的数量大于可以运行任务的OpenMP线程的数量,则程序可能挂起,在这种情况下,OpenMP线程的数量是每个级别两个(每个核心一个。 这是因为通信任务是并发的,所以OpenMP调度程序可以根据调度策略和执行情况自由地决定它们的执行顺序。 由于不能保证两个级别的执行顺序相同,运行中的任务可能试图交换一组不同的块。 这将阻塞MPI库中两个级别的Open MP线程,从而引发死锁情况。 请注意,当OpenMP线程在MPI库中阻塞时,OpenMP线程调度程序无法知道线程已被阻塞,因此无法在该核心上调度另一个OpenMP线程。 因此,核心不能同时执行其他“准备”通信任务。

图2:缺乏MPI开放的MP可操作性可能导致MPI调用任务的死锁

另一方面,从任务中发布MPI操作通常是低效的。 通信任务需要人工数据依赖,以定义所有级别的相同执行顺序,并防止以前的死锁情况。 非阻塞MPI操作(例如,MPI_Irecv)的执行,它启动操作并返回一个MPI请求,以检查其稍后的完成情况,很难管理内部任务。 用户将负责手动检查MPI请求,在大多数情况下导致算法效率低下。

任务-软件MPI(TAMPI)库

The 任务-软件MPI(TAMPI)库 目的是克服所有这些限制,允许安全和高效地执行阻塞和非阻塞MPI操作,从任务内部,在开放MP和 OmpSs-2 任务型模特。 在调用阻塞MPI函数的任务(例如,MPI_Recv)的情况下,库暂停任务,直到操作完成,允许其他“就绪”任务同时在该核心上执行。 该库还为所有非阻塞MPI函数(例如TAMPI_Irecv)定义了TAMPI变体)。 这些函数是非阻塞和异步的,将调用任务的完成绑定到它们所表示的相应的非阻塞操作的最终确定(例如,MPI_Irecv)。 该函数立即返回,以便即使MPI操作尚未完成,任务也可以完成其执行。 当任务执行完成时,任务被认为是完成的,所有挂起的MPI操作都完成了。

图3:HPC软件堆栈与MPI和开放MP互操作性通过TAMPI。

我们在下面的代码中展示了如何使用TAMPI支持进行非阻塞操作的示例。 程序同时接收并使用任务并行处理多个整数。 第一个任务是接收机,它调用TAMPI_Irecv函数开始接收操作。 这使得任务完成取决于接收操作的最终完成。 注意,它声明了对用于接收数据的缓冲区的输出依赖(即数据将写入缓冲区)。 当操作仍在进行时,TAMPI函数可能会立即返回,因此缓冲区不能在那里被消耗。 相反,我们可以在下面的后续任务中使用它,该任务将缓冲区作为输入依赖项。 这样,当MPI操作最终完成时,TAMPI库将透明地完成接收任务并满足消费者任务的输入依赖。 这将最终运行以消耗接收到的数据。 这样,TAMPI库允许开发人员与多个任务并行执行高效和安全的通信。

int recvdata[N]; MPI_Status status[N]; for (int i = 0; i < N; ++i) { #pragma omp task out(recvdata[i]) out(status[i]) { int tag = i; TAMPI_Irecv(&recvdata[i], 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status[i]); // non-blocking and asynchronous // recvdata cannot be accessed yet } #pragma omp task in(recvdata[i]) in(status[i]) { check_status(&status[i]); consume_data(&recvdata[i]); } } #pragma omp taskwait

通过利用OpenMP或OmpSS-2等任务分配模型和TAMPI库,我们可以对大多数应用程序进行有效的任务化,包括计算和通信部分。 这导致计算和通信的有效重叠,这是任务分配模型固有的。 然后,开发人员可以集中精力公开他们的应用程序的并行性,而不是担心低级方面,例如任务发布的MPI操作的处理,这些操作隐藏在TAMPI中。 这种策略还可以通过任务化高级函数来实现自上而下的并行化策略,而不是在叉接方法中看到的低效的自下而上策略。

运用我们的方法

到目前为止,我们已经探讨了MPI和OpenMP之间缺乏互操作性所带来的问题,以及它如何阻碍MPI级别的任务分配。 我们还讨论了提供在TAMPI中实现的这种互操作性的建议。 在里面 这个博客的第二部分我们研究了如何将所提出的方法应用于自适应网格细化应用。 由此产生的代码使用任务跨MPI和开放MP与重要的加速高达12288核心。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3723

    浏览量

    97437
  • HPC
    HPC
    +关注

    关注

    0

    文章

    350

    浏览量

    25071
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LTC6994-1/LTC6994-2:多功能可编程延迟块的深度解析

    LTC6994-1/LTC6994-2:多功能可编程延迟块的深度解析 在电子设计领域,精确的延迟控制和信号处理至关重要。LTC6994-1/LTC6994-
    的头像 发表于 04-02 11:05 238次阅读

    探索LTC6994-1/LTC6994-2:多功能可编程延迟块的设计与应用

    探索LTC6994-1/LTC6994-2:多功能可编程延迟块的设计与应用 在电子设计的领域中,精确的延迟控制和信号处理是许多应用的核心需求。今天,我们将深入探讨Linear Technology
    的头像 发表于 03-30 16:50 110次阅读

    探索 LTC6994-1/LTC6994-2:多功能可编程延迟块的卓越性能与应用

    探索 LTC6994-1/LTC6994-2:多功能可编程延迟块的卓越性能与应用 在电子设计的领域中,可编程延迟块是不可或缺的关键组件,它能够精确控制信号的延迟时间,满足各种复杂电路的
    的头像 发表于 03-30 16:45 122次阅读

    京微齐力亮相2025国际现场可编程技术大会

    12月2日-5日,2025年国际现场可编程技术大会(FPT)在上海成功举办,京微齐力应邀参加此次行业盛会,与全球领先的行业专家学者,共同探讨可编程技术的创新与发展。
    的头像 发表于 12-10 15:00 653次阅读
    京微齐力亮相2025国际现场可<b class='flag-5'>编程技术</b>大会

    思尔芯邀您共聚 FPT 2025,赋能可编程技术新未来

    技术先锋,再启新程!思尔芯将亮相12月2日至5日的2025年国际现场可编程技术大会(FPT),与全球顶尖专家学者及行业伙伴,共同探索可编程技术的前沿发展与应用创新。FPT是亚太地区最具
    的头像 发表于 11-25 09:57 835次阅读
    思尔芯邀您共聚 FPT 2025,赋能可<b class='flag-5'>编程技术</b>新未来

    ‌TE Connectivity HPC 200A连接器技术解析与应用指南

    通过单极200A/1500V大电流连接器,TE Connectivity (TE) 的 HPC 200A连接器提供一种高安全性和可靠性的电池储能系统 (BESS) 解决方案。TE的HPC 200A
    的头像 发表于 11-09 11:44 1117次阅读

    一文了解Mojo编程语言

    Mojo 是一种由 Modular AI 公司开发的编程语言,旨在将 Python 的易用性与 C 语言的高性能相结合,特别适合人工智能(AI)、高性能计算(HPC)和系统级编程场景。以下是关于
    发表于 11-07 05:59

    TE Connectivity HPC 350A BESS连接器技术解析与应用指南

    TE Connectivity HPC 350A电池储能系统(BESS) 连接器专注于通过单极350A/1500V大电流连接器提供高安全可靠的解决方案。这些HPC 350A连接器采用一体式成型触点
    的头像 发表于 11-02 17:59 1608次阅读

    RSA加速实现思路

    1 关于RSA算法 RSA为非对称加密算法(也称为公开密钥算法),是当前比较普遍使用的非对称加密算法之一,常用于密钥交换和数字签名。RSA是一种较为高级、可基于硬件和软件实现的加密算法,安全性能高
    发表于 10-28 07:28

    新思科技测试IO方案加速HPC和AI芯片量产

    为实现更高性能目标,AI与HPC芯片设计正加速向芯粒架构演进。但是传统单片机SOC已经很难在尺寸上继续扩张,异构集成已成为推动半导体创新的核心动力。然而,它也增加了芯片设计的复杂性,需要更先进的测试
    的头像 发表于 10-15 11:33 892次阅读
    新思科技测试IO方案<b class='flag-5'>加速</b><b class='flag-5'>HPC</b>和AI芯片量产

    PIC32 WFI32 Curiosity HPC开发板技术解析

    Microchip Technology WFI32E02高引脚数 (HPC) Curiosity板 (EV89Y10A) 用于评估和演示具有高达200 MHz CPU时钟频率
    的头像 发表于 10-09 14:10 843次阅读
    PIC32 WFI32 Curiosity <b class='flag-5'>HPC</b>开发板<b class='flag-5'>技术</b>解析

    CDCEL913-Q1 汽车目录可编程 1-PLL VCXO 时钟合成器技术手册

    CDCE913-Q1 和 CDCEL913-Q1 器件是基于锁相环 (PLL) 的模块化可编程时钟合成器。这些器件提供灵活且可编程的选项,例如输出时钟、输入信号和控制引脚,以便用户可以
    的头像 发表于 09-17 10:37 995次阅读
    CDCEL913-Q<b class='flag-5'>1</b> 汽车目录可<b class='flag-5'>编程</b> <b class='flag-5'>1</b>-PLL VCXO 时钟合成器<b class='flag-5'>技术</b>手册

    如何使用MA35D1上的硬件2D加速功能?

    如何使用MA35D1上的硬件2D加速功能?
    发表于 09-03 07:46

    泰克EA直流可编程电源串联技术助力800V电动汽车高压架构加速落地

    泰克EA直流可编程电源串联技术助力800V电动汽车高压架构加速落地
    的头像 发表于 08-04 18:17 5614次阅读
    泰克EA直流可<b class='flag-5'>编程</b>电源串联<b class='flag-5'>技术</b>助力800V电动汽车高压架构<b class='flag-5'>加速</b>落地

    低价甩卖技术类书

    =DAmh45YKbbx CZ193 「我在闲鱼发布了【人工智能,嵌入式,编程技术书籍,标价2到3折卖图中所有书,1】」 点击链接直接打开
    发表于 07-31 14:20