我正在尝试改进在ARM cortex-a8处理器上运行的图像处理项目。
我正在从内存中访问8位灰度图像数据。在我的函数中,现在我正在逐字节地访问单个像素值。
我认为通过使用NEON,我可以通过从内存中一次访问128/8 = 16个字节来改进这一点,然后在我的函数中使用它们。但是在运行更改后的版本时,我发现这实际上比逐字节访问需要 MORE 时间。我认为使用NEON获取信息正成为瓶颈,花费的时间比计算时间长。
ARM Cortex-A8的数据总线大小是多少?在一次内存提取中从内存中访问了多少字节?
答案 0 :(得分:3)
来自Cortex A8 TRM:
“您可以将处理器配置为连接64位或128位AXI互连,为系统设计提供灵活性”
NEON是否必要,也许您正在将苹果与橙子进行比较?您可以使用ldrd / strd或ldm / stm来获取64位传输,而不是ldrb / strb。 ARM / AXI可以足够智能地向前看,并将较小的传输分组为更大的传输,比如两个32位传输到一个64位。但我不会依赖于此。我只提到它,如果您发现通过更改为ldr / str或ldrd / strd,您不会获得任何性能提升。
您是否隔离(无数据处理)读取或写入循环并尝试字节vs字与双字?可能是从字中提取字节的代码压倒了总线上的节省。
这是什么类型的记忆?这是芯片外还是芯片外,这种内存相对于AXI(ARM)时钟速度的速度是多少?
您是否为此区域启用了数据缓存?如果是这样,它可能是一个静音点,读取的第一个字节将使用最佳数据总线大小进行高速缓存行填充,该高速缓存行中的后续读取将不会到达目标存储器的AXI总线。同样,写入应该只到缓存,然后以更宽的总线优化大小到达目标。取决于缓存/写缓冲区的配置方式。
答案 1 :(得分:0)
可能是您遇到了管道停滞。如果你想通读Neon,那么在CPU核心中使用这些数据之前会有一些延迟。