【问题标题】:NOPs on Multicore ARM A9多核 ARM A9 上的 NOP
【发布时间】:2016-04-05 18:10:54
【问题描述】:

我有一个基于双核 ARM A9 的处理器,我需要对其进行一些非常特殊的纳秒计时。我计划使用 NOP 汇编指令通过确定系统时钟每个周期通过的纳秒数来实现这一点。

我想知道在处理双核 ARM 处理器时调用 NOP 时是否有任何特殊考虑,因为我只需要处理单核 ATMEL 和 ARM 处理器。处理器是否会尝试自动在两个内核之间分配 NOP?我是否应该将系统时钟速度(667MHz)加倍来计算两个内核的时间?是否有任何其他我看不到的特殊考虑因素可能会妨碍我?

【问题讨论】:

  • 不,每个内核运行自己的指令流。你也不需要加倍。你没有说你是否有一个操作系统,或者是否启用了任何中断。这些事情可能会打乱你的时间;)也不知道 ARM cpus 是否进行时钟频率缩放(省电)。
  • 您尝试做的事情可能站不住脚。 ARM Cortex-A9 使用具有 8 到 11 级流水线的超标量乱序内核。即使不考虑外部事件,如果 ARM 完全记录了所有内容,也必须计算出确切的指令时序。相反,他们的文档说“Cortex-A9 处理器的复杂性使得无法手动计算精确的时序信息。指令的时序通常受到其他并发指令、内存系统活动和指令流之外的其他事件的影响。”
  • 出于兴趣,延迟的实际性质是什么?可能有更多创造性的方法来解决它——我见过的最酷的事情之一是一些外围设备,它需要在操作之间精确延迟几百个总线周期;它在其编程接口中有一个额外的寄存器,它完全没有做任何事情,但是在读取时需要几百个周期才能返回 0:D
  • @Notlikethat 延迟的本质是对来自处理器所连接的设备本身的数字输出的某个信号进行计时。这必须在纳秒时间内完成,才能按照我需要的方式工作。不过我喜欢这个想法,它非常聪明,如果我不试图限制自己只使用处理器本身,那可能会很容易尝试。

标签: assembly arm multicore timing


【解决方案1】:

显然,如果您运行一个非多线程的程序,那么它就无法在两个 CPU 上运行。它总是在一个 CPU 上运行(虽然你不知道是哪一个)。

使用 NOP 计算时序确实不是一个好主意,因为您无法控制指令的发出和执行方式,尤其是因为 Cortex-A9 有多个执行单元。

虽然我不认为这是一个非常可靠的解决方案,但你至少应该使用一个时序为 1 个周期的依赖指令序列:

ADD r0, r0, r0
ADD r0, r0, r0
...

这将有助于每个周期有一条指令,比 NOP 操作更好,但这仍然是一个近似值。

【讨论】:

  • OP 仍将不得不校准他的延迟循环,但使其受延迟限制而不是受吞吐量限制是一个很好的建议,它应该使向循环中添加指令的效果更可预测. (受延迟限制可能也节省了一点功率。ORAND 可能在这里的功率更低。是否有任何低复杂度但更高延迟的指令?也许是存储转发往返?)
  • 确实,架构nop 指令的重点在于,它可以尽早从指令流中删除并在 0 个周期内“执行”——我不认为 Cortex-A9 实际上可以,但一些高端内核可能会。
  • 这一切都非常有帮助,上面的答案绰绰有余,我最初建议 nop 只是因为我在其他代码中看到的试图执行类似计时的内容。如果我的数学是正确的,我在时序的任一方向上都有大约 350 个时钟周期,我希望引入 ADD r0、r0、r0 概念将使我尽可能接近正确的时序
  • @brad 有这么大的回旋余地,尝试轮询 PMU 周期计数器之类的方法也可能是可行的 - 稍加小心,应该可以为适合的循环编写一个循环单个缓存行。
  • @brad95411 在 667 MHz 下,一个周期为 1.5 纳秒长。如果您需要 1 纳秒的精度,您就没有任何余地。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多