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核心。

审核编辑 黄昊宇

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

    关注

    88

    文章

    3571

    浏览量

    93542
  • HPC
    HPC
    +关注

    关注

    0

    文章

    309

    浏览量

    23652
收藏 人收藏

    评论

    相关推荐

    维谛技术(Vertiv):未来HPC,你想象不到的酷炫变革!

    随着AI技术的迅猛发展,高性能计算(HPC)也迎来了新的变革浪潮。在2024全球超级计算机Green500排行榜上,位列前三的超算都采用了“超智融合”的技术理念。超级大脑+AI,科技新CP引领科研
    的头像 发表于 10-30 11:12 151次阅读
    维谛<b class='flag-5'>技术</b>(Vertiv):未来<b class='flag-5'>HPC</b>,你想象不到的酷炫变革!

    AI与HPC技术推动先进封装行业发展

    “随着人工智能(AI)和高性能计算(HPC)技术的迅猛发展,半导体行业也迎来了新的变革浪潮。”——这句话在2024年的今天,早已被喻为行业共识。
    的头像 发表于 10-22 11:22 325次阅读

    云计算hpc的主要功能是什么

    云计算HPC(High-Performance Computing)是指利用云计算技术来实现高性能计算的一种解决方案。云计算HPC将高性能计算能力以云服务的形式提供给用户。
    的头像 发表于 10-22 10:20 131次阅读

    HPC云计算前景

    高性能计算(HPC)与云计算的结合,正逐步成为推动科技创新和产业升级的重要引擎。随着数据规模的不断扩大和计算需求的日益复杂,HPC云计算展现出了巨大的潜力和价值。
    的头像 发表于 10-16 10:17 154次阅读

    云计算hpc是什么意思

    云计算HPC(High-Performance Computing)是指利用云计算技术来实现高性能计算的一种解决方案。
    的头像 发表于 10-15 10:01 173次阅读

    工业机器人的四种编程(示教编程、离线编程、自增强现实编程编程)剖析!

    和工作量,提高编程效率,实现编程的自适应性,从而提高生产效率,是机器人编程技术发展的终极追求。本文将就机器人编程技术的发展作一介绍,希望能给读者带来一些启发。对工业
    的头像 发表于 08-30 12:14 1489次阅读
    工业机器人的四种<b class='flag-5'>编程</b>(示教<b class='flag-5'>编程</b>、离线<b class='flag-5'>编程</b>、自增强现实<b class='flag-5'>编程</b>主<b class='flag-5'>编程</b>)剖析!

    在多FPGA集群上实现高级并行编程

    今天我们看的这篇论文介绍了在多FPGA集群上实现高级并行编程的研究,其主要目标是为非FPGA专家提供一个成熟且易于使用的环境,以便在多个并行运行的设备上扩展高性能计算(HPC)应用。
    的头像 发表于 07-24 14:54 1059次阅读

    助力科学发展,NVIDIA AI加速HPC研究

    科学家和研究人员正在利用 NVIDIA 技术将生成式 AI 应用于代码生成、天气预报、遗传学和材料科学领域的 HPC 工作。
    的头像 发表于 05-14 09:17 373次阅读
    助力科学发展,NVIDIA AI<b class='flag-5'>加速</b><b class='flag-5'>HPC</b>研究

    DE1-SOC进行硬件加速2D N-Body重力模拟器设计

    该项目的目标是创建一个DE1-SOC进行硬件加速2D N-Body重力模拟器。
    的头像 发表于 04-09 11:08 484次阅读
    <b class='flag-5'>用</b>DE<b class='flag-5'>1</b>-SOC进行硬件<b class='flag-5'>加速</b>的<b class='flag-5'>2</b>D N-Body重力模拟器设计

    康佳特欢迎COM-HPC载板设计指南Rev. 2.2的发布 COM-HPC Mini规范现已完善

      2024/4/2 中国上海 * * * 嵌入式和边缘计算技术的领先供应商德国康佳特--欢迎COM-HPC载板设计指南2.2修订版的发布,该指南为开发人员新增了基于95毫米x70毫米COM-
    发表于 04-02 10:47 534次阅读
    康佳特欢迎COM-<b class='flag-5'>HPC</b>载板设计指南Rev. 2.2的发布 COM-<b class='flag-5'>HPC</b> Mini规范现已完善

    硕博电子推出一款基于CoDeSys3.5编程技术的高性能主控制器

    硕博电子自主研发的移动控制器SPC-SFMC-X2214A,采用了CoDeSys3.5编程技术,为分布式应用场合提供了理想的主控制器解决方案。
    的头像 发表于 03-01 11:34 1048次阅读

    什么是HPC高性能计算

    高性能计算(HighPerformanceComputing,简称HPC),是指利用集群、网格、超算等计算机技术,通过合理地组织计算机资源以及运用适合的算法和程序,提高计算效率和处理能力,实现对大量
    的头像 发表于 02-19 13:27 771次阅读
    什么是<b class='flag-5'>HPC</b>高性能计算

    加速SDV诊断开发例的HPC实施方案解析

    向软件定义车辆的快速转变;车载/离线诊断工具和用于HPC实现的加速器; 现有的挑战和需求正在推动E/E体系结构的演进。连接的、软件定义的车辆的需求
    的头像 发表于 11-21 11:27 433次阅读
    <b class='flag-5'>加速</b>SDV诊断开发<b class='flag-5'>用</b>例的<b class='flag-5'>HPC</b>实施方案解析

    C语言的基本概念和编程技术

    电子发烧友网站提供《C语言的基本概念和编程技术.pdf》资料免费下载
    发表于 11-20 10:18 0次下载
    C语言的基本概念和<b class='flag-5'>编程技术</b>

    研扬最新COM-HPC模块让您获得源源不断的强劲性能

    HPC-RPSC的COM-HPC模块拥有比以往任何产品更多的接口、存储和处理能力,旨在为最苛刻的应用提供最高性能。HPC-RPSC支持第12代和第13代IntelCore处理器,兼容超过10个
    的头像 发表于 11-18 08:05 473次阅读
    研扬最新COM-<b class='flag-5'>HPC</b>模块让您获得源源不断的强劲性能