我正在处理一个嵌入式设备,该设备不支持非对齐内存访问。
对于视频解码器,我需要以8x8像素块为单位处理像素(每个像素一个字节)。该设备具有一些SIMD处理能力,允许我并行处理4个字节。
问题在于,8x8像素块不能保证从对齐地址开始,并且函数需要读/写多达三个这样的8x8块。
如果您想要非常好的性能,您会如何处理?经过一番思考,我想到了以下三个想法:
1. 所有内存访问都作为字节进行。这是最简单的方法,但速度慢,并且与SIMD功能不兼容(这是我当前在参考C代码中所做的)。
2. 编写四个复制函数(每个对齐情况一个),通过两个32位读取加载像素数据,将位移至正确位置,然后将数据写入某个对齐的临时存储器块。然后,视频处理函数可以使用32位访问和SIMD。缺点:CPU将无法在处理之后隐藏内存延迟。
3. 与上面的想法相同,但是不要将像素写入临时存储器,而是原地进行视频处理。这可能是最快的方法,但我必须为此方法编写的函数数量很高(我猜大约有60个左右)。
顺便说一下:我将不得不使用汇编语言编写所有函数,因为当涉及到SIMD扩展时,编译器会生成可怕的代码。
您会选择哪条路线,还是您有其他想法来处理这个问题?
对于视频解码器,我需要以8x8像素块为单位处理像素(每个像素一个字节)。该设备具有一些SIMD处理能力,允许我并行处理4个字节。
问题在于,8x8像素块不能保证从对齐地址开始,并且函数需要读/写多达三个这样的8x8块。
如果您想要非常好的性能,您会如何处理?经过一番思考,我想到了以下三个想法:
1. 所有内存访问都作为字节进行。这是最简单的方法,但速度慢,并且与SIMD功能不兼容(这是我当前在参考C代码中所做的)。
2. 编写四个复制函数(每个对齐情况一个),通过两个32位读取加载像素数据,将位移至正确位置,然后将数据写入某个对齐的临时存储器块。然后,视频处理函数可以使用32位访问和SIMD。缺点:CPU将无法在处理之后隐藏内存延迟。
3. 与上面的想法相同,但是不要将像素写入临时存储器,而是原地进行视频处理。这可能是最快的方法,但我必须为此方法编写的函数数量很高(我猜大约有60个左右)。
顺便说一下:我将不得不使用汇编语言编写所有函数,因为当涉及到SIMD扩展时,编译器会生成可怕的代码。
您会选择哪条路线,还是您有其他想法来处理这个问题?