【发布时间】:2013-02-14 07:21:49
【问题描述】:
我有一个简单的 asm 代码,它加载 NEON 的 12 个四位寄存器,并具有并行的成对添加指令以及加载指令(以利用双问题能力)。我已经验证了这里的代码:
http://pulsar.webshaker.net/ccc/sample-d3a7fe78
正如我们所见,代码大约需要 13 个周期。但是当我在板上加载代码时,加载指令似乎每次加载需要超过一个周期,我验证并发现 VPADAL 需要 1 个周期,但 VLD1 需要超过一个周期。这是为什么呢?
我已经处理了以下内容:
- 地址是 16 字节对齐的。
- 在指令
vld1.64 {d0, d1} [r0,:128]!中提供了对齐提示 - 在某些地方尝试了预加载指令
pld [r0, #192],但这似乎会增加周期,而不是实际减少延迟。
谁能告诉我我做错了什么,为什么会出现这种延迟?
其他细节:
- 参考cortex-a8
- arm-2009q1 交叉编译工具链
- 在汇编中编码
【问题讨论】:
-
这是否反映了更多的现实? pulsar.webshaker.net/ccc/beta-sample-d3a7fe78(使用“beta”模拟器)
-
@AkiSuihkonen,这怎么可能? VPADAL和VLD应该可以并行运行,从你给的模拟器链接看不像,还有为什么NEON要这么晚才启动?
-
抱歉,找不到简单的复制粘贴。但是,对您的问题/困惑的回答是,CPU 不能对外部存储器做出时序保证。让它成为一个缓存(如果它没有紧密集成)或更糟糕的外部存储器。这就是人们谈论 ddr2、ddr3 等的原因。它们具有不同的性能特征。你应该在这个阶段阅读你的整个系统,以了解你可以从 l1、l2 和 ram 获得多少停顿。
-
只是再添加一件事(如果有人以前不这样做,我稍后会尝试创建一个正确的答案),TRM 上的时间是“执行”/“发布”-所以我相信他们指的是把你的加载请求放在加载/存储队列中。
-
手册确实声称加载 qX @128 是一个单循环操作——但它必须预先假设一些东西——例如该地址已被预取。
标签: embedded arm simd neon cortex-a8