未对齐的内存访问

2024-06-22

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

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

问题是,8x8 像素块不能保证从对齐的地址开始,并且函数需要读/写最多三个 8x8 块。

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

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

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

  3. 与上面的想法相同,但不是将像素写入临时内存,而是进行视频处理。这可能是最快的方法,但我必须为此方法编写的函数数量很多(我猜大约 60 个)。

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

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


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

不过,最有可能的是,您希望处理处理器寄存器中的内容,而不是内存中的内容。您如何处理任务取决于硬件的功能(例如,一个 32 位寄存器可以拆分为四个 8 位寄存器吗?SIMD 操作在哪些寄存器上运行?)如果您采用简单的路线,您可以调用一个小的加载器函数来为您执行未对齐的读取。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未对齐的内存访问 的相关文章

随机推荐

  • MongoDB 的优点和缺点? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Gradle 升级到 Android Studio 3.0 Beta 1 时出错

    注意 这似乎是 Android 插件的问题 请参阅相关问题的评论 构建项目时出现以下 gradle 错误 Gradle sync failed Cause java lang NullPointerException at sun nio
  • 如何在 Win32 中的两个子进程之间设置管道?

    对于我的一生 我无法弄清楚为什么这不起作用 基本上 我创建了继承位设置为 true 的管道 并创建了两个子进程 并使用 STARTUPINFO 结构根据需要设置输入和输出句柄 但管道似乎已损坏 第二个进程没有向其中写入任何输出 控制台 即使
  • WPF 和 Silverlight 应用程序有什么区别?

    WPF 和 Silverlight 应用程序有什么区别 它们是一样的吗 WPF 基于桌面 CLR 即fullCLR 的版本 Silverlight 基于更小 更紧凑的 CLR 它提供了出色的体验 但不具备 CLR 的全部功能 它还有一个小得
  • 在 href <%= xx %> 中使用带有 runat=server 的服务器变量

    当我在 aspx 页面上使用锚标记时 如下所示 a href test a 它将获得正确分配给 id 的变量值 但不会正确路由页面 因为如果 a 标签上没有 runat server 属性 则不会评估 但是一旦我添加了 runat 服务器属
  • 无法连接到 mongodb 错误:无法连接到服务器 127.0.0.1:27017 at src/mongo/shell/mongo.js:L112

    当我尝试连接到 mongo db 时 我总是收到如下错误 MongoDB shell 版本 2 4 3 连接到 测试 4 月 26 日星期五 14 31 46 941 JavaScript 执行失败 错误 无法连接到服务器 127 0 0
  • 写入大量txt文件(90个),每个文件5MB,最多需要1400s

    我是一名电气工程专业的学生 作为一项作业 我需要实现医学成像中使用的反投影算法来形成图像 为了计算最终图像 需要计算大量信息并将其保存在向量中 在最终图像的某个所需分辨率 256 256 像素 下 程序因 RAM 耗尽而崩溃 因此我决定将此
  • ASP.net MVC 中的 ASP.net AJAX 有什么意义?

    因此 ASP net MVC 默认情况下附带 JQuery 和 ASP net Ajax 虽然 JQuery 的用例很明显而且很多 但我只是想知道 ASP net Ajax 的意义是什么 如果我只是让我的控制器操作返回 JSON 我不需要它
  • “git”无法可见,因为它的所有子项都位于不可用的操作集中

    我有这个问题 我不知道如何获取工具栏上的 Git 部分 下图显示了具体的错误 感谢您的所有回答 在 操作集可用性 中勾选 Git 和 Git 导航操作 然后在 工具栏可见性 中勾选 Git
  • C++:使用声明和重载范例

    我在看这一页 https www cppstories com 2018 09 visit variants 关于 C 17 的 新 功能 特别是我理解几乎所有以下代码 include
  • Android 完成活动不起作用

    一旦用户从我的 ListView 中选择了产品 它就会将该 ListView 中选定的文本放入 EditText 中 我遇到的问题是 当用户从列表中选择一个产品 然后按返回时 它会再次显示该列表 而不是返回到 EditText 活动 我尝试
  • 为什么 Android Studio 无法识别 .jar 库导入?

    我正在尝试在我的 Android Studio 项目中使用一些 jar 文件作为库 我一直在寻找如何做到这一点 常规方法是将 jar 文件复制到 libs 文件夹中 然后将其添加为库 我知道 libs 文件夹必须位于 项目 视图中的 app
  • 切换到heroku cedar-14导致内存消耗持续增加

    Heroku 最近宣布今年 11 月之后将不再支持 cedar 10 切换到 cedar 14 导致内存消耗增加 直到我遇到 R14 内存配额超出 错误并不得不重新启动 heroku 在我开始使用 unicorn worker killer
  • 使用 Javascript 将变量传递给弹出窗口

    我需要将一些文本从当前页面传递到弹出窗口 而不需要服务器点击 该信息 此处用 90 表示 已在父表单中可用 它就像存储在隐藏变量中的一段长文本 我只需要将其显示为弹出窗口 这是我尝试过的 这在某种程度上有效 但如果我传递文本而不是数字 则不
  • Java 错误“未使用局部变量的值”

    我对java真的很陌生 2天前开始学习 抱歉 如果这是一个愚蠢的问题 我正在尝试学习如何使用 rt exec 和类似的方法 因此我尝试制作一个运行 calc exe 的非常简单的程序 这是代码 public class main try R
  • 如何重新启动模拟器进入恢复模式

    有什么办法可以将模拟器重新启动到恢复模式吗 Android模拟器不支持恢复模式 只支持正常启动模式 Android 模拟器接受 Android 映像 包括内核和 ramdisk 映像 作为其命令行界面上的独立映像 它们不会被编译为一个大映像
  • Spring Boot 安全性和设置 security.basic.path

    我正在尝试使用 Spring Boot 它是自动配置 Spring Security 的自动配置未来 我按照教程操作http spring io guides gs secure web http spring io guides gs s
  • 如何将多个复选框值插入到表中?

    我似乎无法找到或弄清楚将多个复选框值从表单插入到表中的工作解决方案 我的结束是将仅一个复选框值的值插入到表中 请指出我如何插入多个复选框值 而不仅仅是一个 在下面找到我到目前为止所拥有的 My form
  • 如何突出显示页面上与单词数组匹配的所有单词?

    我想找到我的网页上与 Javascript 数组中的任何单词匹配的所有单词 并突出显示它们 将它们包装在特殊的 span 标签中 做到这一点最简单的方法是什么 我用jquery 不完美 但简单并且可能有效 var regex Hello G
  • 未对齐的内存访问

    我正在开发不支持未对齐内存访问的嵌入式设备 对于视频解码器 我必须处理 8x8 像素块中的像素 每个像素一个字节 该设备具有一些 SIMD 处理功能 使我能够并行处理 4 个字节 问题是 8x8 像素块不能保证从对齐的地址开始 并且函数需要