video - 未对齐的内存访问

标签 video assembly embedded alignment decoding

我正在开发不支持未对齐内存访问的嵌入式设备。

对于视频解码器,我必须处理 8x8 像素 block 中的像素(每个像素一个字节)。该设备具有一些 SIMD 处理功能,使我能够并行处理 4 个字节。

问题是,不能保证 8x8 像素 block 从对齐地址开始,函数需要读取/写入这些 8x8 block 中的最多三个。

如果你想要非常好的性能,你会如何处理这个问题?经过一番思考,我提出了以下三个想法:

  1. 以字节形式进行所有内存访问。这是最简单的方法,但速度很慢,而且不能很好地与 SIMD 功能配合使用(这是我目前在引用 C 代码中所做的)。

  2. 编写四个复制函数(每个对齐情况一个),通过两次 32 位读取加载像素数据,将位移动到正确的位置并将数据写入一些对齐的临时内存块。然后视频处理功能可以使用 32 位访问和 SIMD。缺点:CPU 将没有机会隐藏处理背后的内存延迟。

  3. 与上述想法相同,但不是将像素写入暂存存储器,而是在适当的位置进行视频处理。这可能是最快的方法,但我必须为此方法编写的函数数量很多(我猜大约有 60 个)。

顺便说一句:我将不得不在汇编程序中编写所有函数,因为编译器在涉及 SIMD 扩展时会生成可怕的代码。

你会走哪条路,或者你有其他想法如何解决这个问题?

最佳答案

您可以使用 memcpy(如果我记得它可以优化以执行单词复制,如果可能)复制到对齐的数据结构(例如,分配在堆栈上或从 malloc)。然后对该对齐的数据结构执行处理。

不过,您很可能希望在处理器的寄存器中处理事情,而不是在内存中。你如何处理你的任务取决于硬件的能力(例如,一个 32 位寄存器可以分成四个 8 位寄存器吗?SIMD 操作对哪些寄存器进行操作?)如果你走简单的路线,您可以调用一个小型加载程序函数来为您执行未对齐读取。

关于video - 未对齐的内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/375259/

相关文章:

audio - 什么是 ffmpeg 视频过滤器 "between"用于音频过滤器的替代品

java - Struts2 - 将请求重定向到另一个应用程序 - 视频

assembly - PowerPC 中应该对有效地址 'wrap' 求和吗?如果是这样,怎么办?

wcf - 为 WCF 编写文件流客户端

c - 按下两个按钮时试图让电机停止

c - 我将如何写入内存?

ios - iOS 上的 Qt 5.5 视频着色器问题

google-maps - 如何从谷歌街景中抓取视频 Hyperlapse

assembly - 如何确定寄存器是从右到左加载,反之亦然

assembly - 分支预测如何与指令指针交互