65.9K
CodeProject 正在变化。 阅读更多。
Home

为 Arm 平台优化 C/C++ 程序

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2024年4月30日

CPOL

4分钟阅读

viewsIcon

2628

本文讨论了通过优化编译器代码来提高程序性能的各种技术,重点是 ARM 平台。

现在的编译器已经非常擅长自行生成高度优化的代码。但是,在某些情况下,作为程序员,您可以帮助编译器生成更好的代码。这篇博文介绍了创建更高性能程序的技巧,无论您是创建 Android、桌面还是服务器应用程序。

内存别名和 'restrict' 关键字

每当编译器自动向量化代码时,它首先需要确保这样做是安全的。其中一项执行的安全检查是针对指针别名。此检查用于查看编译器正在读取和写入的指针是否可以指向相同的数据。当编译器无法静态确定这一点时,它必须插入运行时检查。

这些检查会大大降低您的程序速度,或者更糟糕的是,如果无法插入运行时检查,则会完全无法向量化。但是,作为程序员,您可以告诉编译器继续并假设指针不别名。阅读以下 URL 中的学习路径,了解在 C 中正确使用 'restrict' 关键字的重要性。

了解 restrict 关键字

内存延迟

将数据加载和存储到内存是 CPU 完成需要时间的活动。所需时间取决于多种因素,但作为程序员,您可以采取各种措施来缩短此访问时间。通常,编译器无法为您执行这些操作,因此了解这些技术可以为您的程序提供所需的优势。阅读以下 URL 中的内存延迟学习路径,以更好地了解 Arm 平台上的缓存、预取和数据对齐。

了解内存延迟

利用整数与浮点数

使用整数算术运算代替浮点算术运算通常可以显着加快程序速度,因为 CPU 往往具有更多的带宽来执行整数算术运算。但是,在某些情况下,由于编程语言的语义,您可能会无意中得到浮点运算。一个常见的陷阱是隐式转换为浮点数。阅读以下 URL 中的整数与浮点数的速度优势学习路径,了解如何避免这些陷阱并利用整数性能的强大功能来获得更快的程序。

了解整数与浮点数性能

利用编译器中的自动向量化

现代编译器通常被称为优化编译器,因为它们对您的输入程序执行各种优化和转换,以获得更好的性能。其中一种优化是将您的程序从标量转换为向量。向量化的行为是指将您的程序从一次处理一个值转换为一次可以在每个操作中处理多个值。

虽然编译器在这方面做得很好并且不断改进,但您仍然可以通过各种方式构造程序的流程,使编译器更容易执行自动向量化并利用 Advanced SIMD 和 SVE 指令的强大功能。

有兴趣吗?请阅读以下 URL 中的更多信息

了解如何利用自动向量化

修改循环布局以使其对自动向量化友好

在编写对自动向量化友好的程序时,数据布局也同样重要。当编译器在自动向量化期间转换循环时,它可以按顺序加载数据,还是需要跳过一些元素(例如,每隔一个元素加载),这会产生显着差异。即使是读取数组中结构体字段的访问,例如 data[i].x,也可能导致跨步访问。

高效的数据布局可能是程序速度快慢的区别。这是编译器通常没有足够的上下文来提供帮助的领域之一,因此程序员了解如何帮助编译器非常重要。有兴趣将程序的性能提升到新的水平吗?请阅读以下链接中的更多信息。

了解数据布局

摘要

Arm 架构具有许多出色的功能,如果使用得当,可以显着提高程序的性能。如果您记住这些技巧和背景知识,就可以轻松地利用它们。

请务必阅读此处的其他学习路径:https://learn.arm.com,以获取有关如何最好地利用 Arm 平台提供的所有功能的其他有用且信息丰富的提示。

阅读更多 Arm 学习路径

© . All rights reserved.