我正在开发不支持未对齐内存访问的嵌入式设备。
对于视频解码器,我必须处理 8x8 像素 block 中的像素(每个像素一个字节)。该设备具有一些 SIMD 处理功能,使我能够并行处理 4 个字节。
问题是,不能保证 8x8 像素 block 从对齐地址开始,函数需要读取/写入这些 8x8 block 中的最多三个。
如果你想要非常好的性能,你会如何处理这个问题?经过一番思考,我提出了以下三个想法:
以字节形式进行所有内存访问。这是最简单的方法,但速度很慢,而且不能很好地与 SIMD 功能配合使用(这是我目前在引用 C 代码中所做的)。
编写四个复制函数(每个对齐情况一个),通过两次 32 位读取加载像素数据,将位移动到正确的位置并将数据写入一些对齐的临时内存块。然后视频处理功能可以使用 32 位访问和 SIMD。缺点:CPU 将没有机会隐藏处理背后的内存延迟。
与上述想法相同,但不是将像素写入暂存存储器,而是在适当的位置进行视频处理。这可能是最快的方法,但我必须为此方法编写的函数数量很多(我猜大约有 60 个)。
顺便说一句:我将不得不在汇编程序中编写所有函数,因为编译器在涉及 SIMD 扩展时会生成可怕的代码。
你会走哪条路,或者你有其他想法如何解决这个问题?
最佳答案
您可以使用 memcpy
(如果我记得它可以优化以执行单词复制,如果可能)复制到对齐的数据结构(例如,分配在堆栈上或从 malloc
)。然后对该对齐的数据结构执行处理。
不过,您很可能希望在处理器的寄存器中处理事情,而不是在内存中。你如何处理你的任务取决于硬件的能力(例如,一个 32 位寄存器可以分成四个 8 位寄存器吗?SIMD 操作对哪些寄存器进行操作?)如果你走简单的路线,您可以调用一个小型加载程序函数来为您执行未对齐读取。
关于video - 未对齐的内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/375259/