本章节翻译by weavingtime@formail.com 原文:Introduction (intel.com)
目录
设计高性能异构计算软件需要开发者利用加速器(如GPU)的优势,并且需要与设计传统同构计算软件时不同的思考方式。你需要了解你的代码将在哪些硬件上运行,以及哪些特征会影响硬件性能。你的目标是构建的代码能够最大化硬件能力并且产生正确答案。
oneAPI是一种跨行业的、开放的、基于标准的、统一的编程模型,为加速器架构提供了一种通用的开发体验。加速器的一个独特特征是它们增强了平台上主CPU的计算能力。使用加速器的主要好处是通过将软件分别部署到主机和加速器,这样可以在加速器上运行最佳的计算部分来提高整体的性能。加速器架构可以把某些类别的计算运行在专业的计算硬件上来提供优势。这使它们能够为专门针对加速器架构的软件提供最佳结果。
本文档的主要关注点是GPU。本书的每个部分都侧重于不同的主题,以指导开发者逐步创建优化的解决方案。 Intel® oneAPI工具包提供了用来优化代码的语言和开发工具。这包括编译器、调试器、分析器、分析器和软件库。
高性能
虽然本文档侧重于GPU,但你可能还需要让应用程序运行在CPU和其他类型的加速器上。由于不同的加速器架构具有不同的特性,你需要定制化你的代码以获得最佳性能。定制化包括重构和调整代码,以创建应用程序到硬件的最佳映射。在极端情况下,这可能需要为每个加速器重新设计算法,以达到最好的计算性能。oneAPI的价值在于它允许这些变化中的每一种都用一种通用语言表达,并在适当的加速器上启动设备特定的变体。
影响性能的因素
使用GPU的第一个考虑因素是确定应用程序的哪些部分可以受益。这部分通常是计算密集型代码,具有合适的内存访问与计算比例,并且具有正确的数据依赖模式以映射到GPU上。GPU中一般有本地内存,可以提供大规模并行性。这决定了在部署代码到加速器时,代码的哪些特征最重要。
Intel® oneAPI基础工具包中包含的 Intel® Advisor工具旨在分析你的代码,包括内存访问与计算比例,并帮助你确定并行执行的最佳机会。 Intel® Advisor中的分析器可以统计函数中的数据移动、内存访问模式和计算量,以预测代码在映射到不同加速器时的性能。潜在收益最高的代码区域应该是你首先部署到加速器的部分。
GPU通常在多个层次上利用并行性。这包括主机和设备之间的并行、计算核心之间的并行性、计算和内存访问之间的并行、并发的流水线和向量化的计算。充分利用所有层次的并行性需要对GPU架构、编程语言、软件库和性能分析工具有很好的理解。
保持所有计算资源忙碌。 必须有足够多的任务来填充设备,但如果程序只有一个任务,那么设备将有99%处于空闲状态。通常,你会创建比可用计算资源多得多的独立任务,以便硬件在先前任务完成后可以安排更多工作。
最小化主机和设备之间的同步。 主机在设备上启动kernel并等待其完成。启动kernel会产生开销,因此设计程序的时候要考虑尽可能减少启动内核的次数。
最小化主机和设备之间的数据传输。 数据通常在开始的时候储存在主机上,并作为输入复制到设备上进行计算。当计算完成时,结果必须传输回主机。为获得最佳性能,需要最小化数据传输,比如把计算的中间结果保存在设备内存中。通过把计算和数据移动并行化来减少数据传输的影响,使计算核心永远不必等待数据。
将数据保留在更快的内存中并使用适当的访问模式。 GPU架构具有不同类型的内存,这些内存具有不同的访问成本。寄存器、缓存和中间结果暂存器比本地内存更便宜,但容量更小。当数据加载到寄存器、缓存行或内存页中时,请在移动到下一个数据块之前使用完所有数据。当内存被分段时,请小心选择步幅来避免所有计算核心同时尝试访问同一内存段。
性能分析和调优
在你完成高性能代码的设计之后,下一步是测量它在目标加速器上的运行情况。在代码中添加计时器,收集跟踪数据,并使用 Intel® VTuneTM Profiler等工具观察程序运行情况。 VTuneTM Profiler收集到的信息可以显示硬件何时出现瓶颈以及何时空闲,并通过视图展示应用程序运行与硬件瓶颈在时间轴上的比较情况,来确定最重要的热点以便做重点优化。
源代码示例
在整个指南中,我们使用真实的代码示例来说明优化技术。本指南中的所有示例都可以在 oneAPI-samples GitHub repo 中找到。现在你可以开始下载示例,并按照那里的说明来设置好你的环境。
我们尽可能使示例简短且易于理解,以便每个示例中的优化技术不会被示例的复杂性所掩盖,可以让你快速掌握。本文中引用了来自示例的代码片段。
有句古话说:“不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。” 强烈建议读者在阅读文本时遇到代码片段时暂停一下,尝试在真实机器上运行示例。
欢迎来到 Intel® oneAPI GPU优化指南!