优化 neon 代码的一些疑惑

Posted

技术标签:

【中文标题】优化 neon 代码的一些疑惑【英文标题】:Some doubts in optimizing the neon code 【发布时间】:2011-12-16 12:00:00 【问题描述】:

我在汇编中编写了一些霓虹灯代码,旨在最大限度地优化。尽管这些数字看起来令人满意,但我有兴趣了解进一步优化它的可能性。然后我遇到了一个在线工具,可以帮助计算每条指令的周期。

这里是我的代码的链接:http://pulsar.webshaker.net/ccc/sample-115d4c29

它清楚地标出了我关注的领域,但我无法清楚地理解这些陈述包含开销的原因。

代码段在“注释”区域分为7个部分,方便参考。

提前致谢。 :)

【问题讨论】:

codereview.stackexchange.com ? 如果您阅读底部的键,这似乎是不言自明的 - 是因为它是法语,您很难理解它,还是您不熟悉技术术语与管道、停顿等有关? 它的问题与技术术语有关:'n.7-0 2c neon-a','n.43-0 2c n0 d16:7' 第一种情况下的neon-a是什么,在后一种情况下,怎么可能需要 7 个半周期等等。那么那些“红色”和“黄色”指的是什么。我在网站上注意到的一件事是它不是那么准确。我可以使用我的优化代码进行更好的性能分析,他们说这比示例中的代码有很多周期开销。!但它仍然值得一个工具。! @JensBjörnhager:是的。我正要在那里发帖,但觉得这是一个更好的地方,因为在 codereview 中没有找到与 arm、cortex、neon 等相关的主题或用户 :) 【参考方案1】:

你可以试试这个链接

http://pulsar.webshaker.net/ccc/beta-sample-115d4c29

这使用循环计数器的 beta 版本 0.9。 主要区别在于 NEON 模拟器不再使用 2 个不同的管道。 由于 Cortex A9 无法在一个周期内执行 2 条 NEON 指令。

我开始更新循环计数器的某些部分。

结果是:

-Cortex A9 的周期信息更准确。

-结果更容易阅读,因为大部分 NEON 延迟信息是由于未配对的指令造成的。

橙色表示等待管道导致的延迟

红色表示由于寄存器冲突导致的延迟。

寄存器附近指定的数字不是松散周期数。这是您可以在此指令之前放置的最大指令数。

希望对你有所帮助!

【讨论】:

哦.. 我不知道不再支持流水线。我的 beagleboard 仍然支持流水线,并且在明智地使用时看起来很有效。红色出现在一些我没有注意到任何注册冲突并让我感到困惑的情况下。现在测试版更加清晰。 “n.48-0 2c d16:3”是指 3 个半周期还是完整周期?我注意到“vext”能够与“vld”并行执行。旧版本的计算器似乎不接受这一点。 :) 您提供的计算器对我了解霓虹灯非常有用。非常感谢。!! 还有一个疑问:“neon-a”,它代表什么。 对于 d16:3 不,新版本中不再有半周期。 3 是您可以在 VLD 之前放置的指令数。在 Cortex A9 上,您可以拥有的最佳 NEON 性能是 1 条指令/周期。所以 3 是 3 条指令或 3 个周期(如你所愿)。 neon-alu (neon-a) 是一个错误,表示霓虹灯的 alu 单元正在使用中。在这种情况下,模拟器应该用橙色而不是红色写“n0”。因为这意味着由于无法将指令与前一个指令配对,NEON 必须等待流水线 0。我有一些错误要修补到模拟器中,但我现在没有时间。 最后评论。 Cortex A9 仍然支持流水线。不再支持的是双指令功能(仅在 NEON 单元上)。这不是一回事!!!

以上是关于优化 neon 代码的一些疑惑的主要内容,如果未能解决你的问题,请参考以下文章

Qualcomm Scorpion 双核 ARM NEON 代码有问题?

从 SSE 到 ARM Neon 的指令转换

NEON 增加运行时间

android 上 OpenCV 的优化(neon 指令,tegra 3 上的 GLSL)

iOS 上 NEON 代码的奇怪结果,跳转到 __ARCLite__load?

霓虹灯代码没有优化