跳转到内容

多核架构代码迁移方法

0% developed
来自维基教科书,开放世界开放书籍

本维基教科书描述了一种逐步方法,用于将传统代码移植到多核架构。

此方法由高性能计算 (HPC) 参与者用作 HMPP 能力中心的一部分。 HMPP 能力中心汇集合作伙伴,在技术(并行编程、代码调优等)和应用程序级别应对多核编程挑战。

将代码移植到多核系统

[编辑 | 编辑源代码]

将代码移植到多核系统是一个复杂的操作,需要整合许多技能才能实现计划结果的计划工作量。从计算机科学的角度来看,将应用程序移植到多核目标包括提供一个等效的程序,该程序通过利用硬件级别的并行性来更快地运行。目标是提高性能,而不必使用所有硬件组件。如果基于串行代码的解决方案是最好的,则应考虑它。

迁移应用程序主要有两个交织的维度

  1. 实现高性能;
  2. 从应用程序开发人员的角度来看,保持代码的可读性/可维护性。迁移后的代码仍然可以被代码所有者理解以及易于维护是一个主要约束。

在大多数情况下,起点是顺序遗留程序。它的迁移主要是因为没有自动过程可以将顺序代码转换为利用大量内核的大规模并行版本。由于处理器格局的快速发展使软件开发变得更加复杂,因此通常的并行编程策略将不得不进行修改以适应现有应用程序,以便利用这些新处理器。

传统代码方法

[编辑 | 编辑源代码]

除了清楚地了解如何将应用程序迁移到新的多核处理器(目前是 GPU)外,方法的主要目标是降低风险并提高效率。事实上,开始一个项目并在几个月后意识到已经投入了工程资源和资金但该项目无法成功,这是不可行的。

此处定义的代码迁移过程不过是将开发周期细分为具有相关持续时间的步骤的常识方法。每个步骤都指示使用哪些工具,并在开始下一阶段之前产生一个继续/停止决策。

三个步骤是

  1. 并行项目定义:在此步骤中,对应用程序进行诊断,以评估潜在的加速并确定与成本相关的主要移植操作。作为先决条件,将建立一个验证过程以确保数值结果的有效性。
  2. 应用程序移植:在几周内,开发了代码的第一个功能性 GPU 版本,并执行了 GPU 执行配置文件以识别瓶颈,以便在下一步中提高代码效率。
  3. 应用程序优化:分析瓶颈并执行代码优化以获得经过微调的生产代码。由于存在未成功的风险,此步骤可能比之前的步骤持续时间更长。

前两个步骤属于初始阶段的一部分,旨在展现异构并行性。它们由熟悉应用程序算法和计算方法的程序员执行。第三步,即第二阶段,需要更多代码调优技术的技能。

这些步骤是在控制成本的情况下定义的。随着迁移过程的进行,失败的风险降低,可以将更多人力投入到最终操作中。迁移方法真正面向在给定时间段内进行“尽力而为”的方法。

图 1:方法概述

图中展示的工具只是示例,可以借助参考资料进行补充。

步骤 1:并行项目定义

[编辑 | 编辑源代码]

图 1 中的顶部部分详细介绍了执行的步骤,以分析代码并定义主要的迁移操作

  • 热点识别:使用分析工具,此第一阶段旨在找到可能从 GPU 加速中受益的关键热点。可能需要重写代码以增加数据并行性。
  • CPU 分析:CPU 分析是必要的,以确保原始代码已充分优化,可以作为公平的性能比较基准。调优 CPU 代码通常也会导致有效的迁移起点。
  • 并行性发现:此步骤确保内核可以并行执行。如果不是这种情况,加速器将无法实现性能提升。然后应重新考虑算法以展现并行性。
图 2:并行项目定义和第一个应用程序移植

步骤 2:应用程序移植

[编辑 | 编辑源代码]

图 2 底部的框给出了开发和构建应用程序的第一个功能性 GPU 版本的步骤。它们主要包括通过使用 HMPP 指令注释先前识别的热点来生成和调用 GPU 内核。

这些步骤是增量执行的:内核被逐个移植和验证;根据原始 CPU 性能评估其性能,以检查它们是否适合 GPU 执行;根据 HMPP 向导的建议,对内核计算应用基本的代码转换,以使其对 GPU 友好;一些数据传输基本上进行了优化,以便在代码片段执行之前预加载数据并抑制对常量数据的冗余传输。此初步移植版本用作识别 GPGPU 问题以及验证实现的并行属性。通过能够跟踪更改,增量方式允许更容易地查找和纠正错误,在最坏的情况下可以恢复。事实上,如果一次进行太多转换,很容易迷失方向。

步骤 3:应用程序优化

[编辑 | 编辑源代码]
图 3:并行代码优化步骤

在此最后一步中,通过进一步减少数据传输、微调 GPU 内核性能以及将 GPU 设备分配移动到应用程序启动时来优化整个混合应用程序。

启动多核迁移项目的清单

[编辑 | 编辑源代码]

硬件/软件环境

[编辑 | 编辑源代码]
  • 目标架构和操作系统是什么?
  • 对编译器、库、软件许可证(例如 GPL)有什么限制?

应用程序代码

[编辑 | 编辑源代码]
  • 所有代码和必要的库是否都可以在目标机器上使用?
  • 是否有可用的代表性输入数据集?
  • 与顺序结果相比,并行执行结果是否需要逐位等效?
  • 是否已定义验证执行结果的过程(考虑到浮点数舍入的更改)?
  • 是否有能够回答有关应用程序代码和算法问题的参考人?
  • 是否清楚地定义了性能目标(以及在哪些执行配置文件上)?
  • 是否有可用的代码功能描述和文档?
  • 通常执行哪些类型的生产运行(例如吞吐量模式、截止日期模式等)?

参考文献

[编辑 | 编辑源代码]

书籍和论文

[编辑 | 编辑源代码]
  • Banerjee, U., Bliss. B., Ma, Z. 和 Petersen, P.,“在英特尔® 线程检查器中揭示数据竞争检测”,于 2006 年 3 月 26 日在美国纽约曼哈顿举行的第一届多核系统软件工具研讨会 (STMCS) 上发表,与 IEEE/ACM 国际代码生成与优化研讨会 (CGO) 同时举行。
  • D.F. Bacon、S.L. Graham、O.J. Sharp,面向高性能计算的编译器转换,“ACM 计算机调查”,1994 年 12 月,第 26 卷,第 4 期,第 345-420 页
  • David Blair Kirk、Wen-mei W. Hwu:大规模并行处理器编程——实践方法。Morgan Kaufmann 2010:I-XVIII,1-258
  • F. Bodin、S. Bihan,“面向图形处理单元的异构多核并行编程”,科学编程杂志,第 17 卷,第 4 期 / 2009 年。
  • G. Hager 和 G. Wellein:面向科学家和工程师的高性能计算入门。CRC 计算科学系列,2010 年。 ISBN 978-1439811924
  • Herlihy,M. 和 Shavit,N.,多处理器编程艺术,Morgan Kaufmann,2008 年。
  • John L. Hennessy 和 David A. Patterson。2003 年。计算机体系结构;定量方法(第 3 版)。Morgan Kaufmann 出版公司,美国加利福尼亚州旧金山。
  • Kennedy,K. 和 Allen,J. R. 2002 年。面向现代体系结构的优化编译器:基于依赖项的方法。Morgan Kaufmann 出版公司。
  • 科学应用程序的性能优化,David H. Bailey、Robert F. Lucas、Samuel Williams
  • S. Akhter:多核编程:通过软件多线程提高性能。英特尔出版社,2006 年。 ISBN 978-0976483243
  • Timothy Mattson、Beverly Sanders 和 Berna Massingill。2004 年。并行编程模式(第一版)。Addison-Wesley 专业版。
  • U. Banerjee。面向超级计算的依赖项分析。Kluwer 学术出版社,马萨诸塞州诺威尔,1988 年。

在线资源

[编辑 | 编辑源代码]

网上有很多资源,以下列举了一些。

华夏公益教科书