ARM Cortex-A8:一次内存读取可以获取多少字节?

4
我正在尝试改进在ARM Cortex-A8处理器上运行的图像处理项目。
我从内存中访问8位灰度图像数据。在我的函数中,现在我通过逐字节方式访问单个像素值。
我认为通过使用NEON,我可以通过一次从内存中访问128/8 = 16个字节并在我的函数中使用它们来改进此过程。但是,在运行更改版本后,我发现这实际上比逐字节访问花费更多时间。我认为我的使用NEON获取数据已成为瓶颈,需要更多时间来完成,超过了计算时间。
ARM Cortex-A8的数据总线大小是多少?每个内存获取访问多少字节?

缓存通常会将其抽象化。它将进行突发读写操作从SDRAM中。如果您正在使用直接屏幕内存,则缓存可能是写入透过的。答案取决于您使用的内存。您应该始终对内存性能进行基准测试,然后与您的代码进行比较。请参见:Cortex-A8 memory copy - artless noise
2个回答

3

来自Cortex A8 TRM:

“您可以配置处理器连接到提供系统设计灵活性的64位或128位AXI互连。”

NEON是否必要,也许您正在比较苹果和橙子?您可以使用ldrd / strd或ldm / stm来获得64位传输,而不是ldrb / strb。ARM / AXI可以足够聪明地向前查看,并将较小的传输分组为更大的传输,例如将两个32位传输合并为一个64位传输。但我不会依赖它。我只是提到它,以防您发现通过更改为ldr / str或ldrd / strd,您没有实现任何性能提升。

你隔离了(无数据处理)读取或写入循环,并尝试字节,字和双字吗?可能是从字中提取字节的代码超过了总线上的节省。

这是什么类型的存储器?这是芯片内还是芯片外,这种存储器相对于AXI(ARM)时钟速度有多快?

您在此区域启用了数据缓存吗?如果是,则可能是哑点,第一个字节读取将使用最佳数据总线大小进行缓存行填充,该缓存行内的后续读取不会达到AXI总线,更不用说目标存储器了。同样,写入应该只到达缓存,并稍后以优化的宽总线大小传输到目标。这取决于缓存/写缓冲区的配置。


你需要向供应商询问,确定这是一个64位还是128位宽的AXI总线。 - old_timer
你可能想要尝试在128位边界上使用具有128位倍数的LDM。我认为,我熟悉的处理器上的64位AXI总线将在单个AXI命令上执行多个总线宽度读取(但对于写入不是这样),但供应商连接到该AXI总线的内容以及他们如何实现它仍然可能会影响你。 - old_timer
我知道我本可以编辑我的回答,但选择不这样做。使用ldm将导致需要移动和隔离每个字节,这是很多工作,然后对每个字节执行所需的操作,而单独的字节读取则可以使用缓存而无需进行移位,但会导致单独的axi传输(如果是l2)或者可能没有axi传输(如果是l1)。如果需要执行simd指令,则固定点ldm等内容可能会成为问题。 - old_timer

0

你可能会遇到流水线停顿的情况。如果你想通过Neon进行读取,在将数据用于CPU核心之前会有一些延迟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接