我正在开发不支持未对齐内存访问的嵌入式设备。
对于视频解码器,我必须处理 8x8 像素块中的像素(每个像素一个字节)。该设备具有一些 SIMD 处理功能,允许我并行处理 4 个字节。
问题是,8x8 像素块不能保证从对齐的地址开始,并且函数需要读取/写入最多三个这些 8x8 块。
如果您想要非常好的性能,您将如何处理?经过一番思考,我想出了以下三个想法:
将所有内存访问作为字节进行。这是最简单的方法,但速度很慢,而且它不适用于 SIMD 功能(这是我目前在参考 C 代码中所做的)。
编写四个复制函数(每个对齐情况一个),通过两个 32 位读取加载像素数据,将位移动到正确的位置,并将数据写入一些对齐的暂存内存块。然后视频处理功能可以使用 32 位访问和 SIMD。缺点:CPU 将没有机会隐藏处理背后的内存延迟。
与上述相同的想法,但不是将像素写入暂存内存,而是进行视频处理。这可能是最快的方法,但是我必须为这种方法编写的函数数量很多(我猜大约 60 个)。
顺便说一句:我将不得不在汇编程序中编写所有函数,因为编译器在涉及 SIMD 扩展时会生成可怕的代码。
你会走哪条路,或者你有其他想法如何解决这个问题?