您的向量化效果如何?
使用 Intel® Advisor 深入了解您的应用程序向量化的程度
确定应用程序的向量化程度对于在系统上获得最佳性能至关重要。在本文中,我们将介绍如何精确定位向量化问题、了解硬件的使用情况,并使用 Intel® Advisor 进行性能优化。Intel® Advisor 提供 免费的独立版本,也包含在 Intel® Parallel Studio XE 和 Intel® System Studio 中。
Intel Advisor 可帮助您查看
- 哪些循环被向量化
- 数据类型、向量宽度和指令集(例如 AVX-512、AVX2)
- 执行了多少浮点和/或整数运算
- 多少指令用于计算,多少用于内存操作
- 您的寄存器利用率
- 如何改进您的向量化
- 以及更多
获得卓越的性能
要使应用程序获得顶级的性能,您需要了解如何充分利用系统的所有资源。Intel Advisor 全新且改进的摘要视图(图 1)可以表明应用程序的整体性能如何。
您可以查看使用的向量化指令集和一些有用的性能指标。此视图现在包含一个程序特性部分,该部分将您的相对性能与系统上可获得的峰值性能进行比较。在图 1 中,请注意应用程序使用了多种不同的指令集——这是我们应该调查的。同时请注意,程序获得的向量化效率仅为 42%。我们失去了 58% 的效率?我们可以进一步深入研究。
深入研究
您可以在调查和屋顶线(roofline)选项卡(图 2)中获得更多详细信息。调查视图提供了逐循环的详细信息。重点关注您花费时间最多的循环,并尝试使这些循环尽可能高效地向量化。Intel Advisor 会突出显示循环是否被向量化及其效率。如果编译器无法向量化循环,Intel Advisor 会告诉您原因。性能问题列可以为您提供效率低下的原因线索。
指令集分析
指令集分析(图 3)深入探讨了编译器如何向量化您的代码。它显示了
- 使用的向量化指令集
- 向量宽度
- 操作的数据类型
“特征”(traits)列通常指示编译器为了将您的数据结构放入向量而必须执行的内存操作。这些内存操作可能是效率低下的指标。
在我们的示例应用程序中,主循环使用的是 Intel® AVX-512,但向量宽度仅为 128 和 256。此外,如果您的应用程序似乎表现不佳,Intel Advisor 会向您发出警告消息并提供优化建议(图 4)。
重新编译以启用 ZMM 寄存器可获得图 5 中的指令集分析。我们的大多数循环现在都使用了完整的 512 字节向量寄存器。在我们的示例中,使用 ZMM 寄存器提高了性能。然而,情况并非总是如此。这取决于具体应用。
使用 Intel Advisor GUI 的中间部分
Intel Advisor GUI 中间的选项卡包含丰富的程序信息(图 6)。
“建议”(recommendations)选项卡是获得性能改进技巧的好方法(图 7)。例如,如果一个循环没有被向量化,“向量化”(vectorization)选项卡可以告诉您原因,并提供代码示例说明如何解决该问题。
代码分析
“代码分析”(code analytics)选项卡(图 8)提供了有关循环中发生情况的详细信息。您可以从宏观层面查看性能,也可以获取所有操作的统计数据以及指令混合摘要。
所有操作的统计信息
您可以获取所有操作的统计信息,包括浮点(FLOPS)、整数(INTOP)或混合(INT+FLOAT)操作(图 9)。这为您提供了关键性能指标的详细视图,显示了每秒执行的指令数。此视图还提供了有关您如何有效利用循环中内存层级的指标。
您执行了多少操作?
您的循环中有哪些类型的指令?它们是计算密集型还是内存密集型?Intel Advisor 可以回答这些问题,并为您提供静态和动态指令计数,以及静态指令混合摘要(图 10)。您可以获得执行的每种指令的百分比,从而可以看到您是否真的在应该使用的地方使用了最新的指令。
优化向量化
优化程序的向量化至关重要。使用 Intel Advisor 等工具了解您的程序向量化程度有助于确保您充分利用硬件。