我正在开发不支持未对齐内存访问的嵌入式设备。
对于视频解码器,我必须处理 8x8 像素块中的像素(每个像素一个字节)。该设备具有一些 SIMD 处理功能,使我能够并行处理 4 个字节。
问题是,8x8 像素块不能保证从对齐的地址开始,并且函数需要读/写最多三个 8x8 块。
如果您想要非常好的性能,您会如何处理这个问题?经过一番思考,我得出了以下三个想法:
所有内存访问均以字节形式进行。这是最简单的方法,但速度很慢,而且不能很好地使用 SIMD 功能(这就是我目前在参考 C 代码中所做的)。
编写四个复制函数(每个对齐情况一个),通过两次 32 位读取加载像素数据,将这些位移动到正确的位置,并将数据写入临时内存的某个对齐块。然后视频处理功能可以使用 32 位访问和 SIMD。缺点:CPU 没有机会隐藏处理背后的内存延迟。
与上面的想法相同,但不是将像素写入临时内存,而是进行视频处理。这可能是最快的方法,但我必须为此方法编写的函数数量很多(我猜大约 60 个)。
顺便说一句:我必须用汇编程序编写所有函数,因为编译器在涉及 SIMD 扩展时会生成可怕的代码。
您会走哪条路,或者您有其他想法如何解决这个问题?
您可以使用memcpy
(如果我记得的话,如果可能的话,可以优化以执行字复制)复制到对齐的数据结构(例如,在堆栈上分配的东西或从malloc
)。然后对对齐的数据结构执行处理。
不过,最有可能的是,您希望处理处理器寄存器中的内容,而不是内存中的内容。您如何处理任务取决于硬件的功能(例如,一个 32 位寄存器可以拆分为四个 8 位寄存器吗?SIMD 操作在哪些寄存器上运行?)如果您采用简单的路线,您可以调用一个小的加载器函数来为您执行未对齐的读取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)