如何将两个打包的 64 位四字加载到 128 位 xmm 寄存器中

2023-11-29

我有两个 UInt64(即 64 位四字)整数。

  • 它们与 8 字节对齐(sizeof(UInt64)) 边界(如果这对任何事情有用的话,我也可以将它们对齐到 16 字节)
  • 它们被挤在一起,所以它们在内存中是并排的

我如何将它们加载到 xmm 寄存器中,例如xmm0:

enter image description here


我发现:

movq xmm0, v[0]

但这只会移动v[0],并将高 64 位设置为xmm0到零:

xmm0 0000000000000000 24FC18D93B2C9D8F

奖励问题

  • 我怎样才能让他们回来?
  • 如果它们在内存中不是并排的怎么办?
  • 如果它们是 4 字节对齐怎么办?

Edit

正如 W. Chang 指出的,字节序化很小,我同意它是相反的:

enter image description here

我的难题是如何让他们进来,以及如何让他们出去。


对于未对齐的 128 位加载,请使用:

  • movups xmm0, [v0]: 移动未对齐的单精度浮点 for float or double数据。 (movupd多了 1 个字节,但不会造成性能差异。)
  • movdqu xmm0, [v0]: 移动未对齐的双四字

即使两个四字跨缓存行边界分开,这通常也是吞吐量的最佳选择。 (在 AMD CPU 上,当负载不适合缓存行的对齐 32 字节块(而不仅仅是 64 字节缓存行边界)时,可能会受到惩罚。但在 Intel 上,64 字节内的任何未对齐缓存线是免费的。)

如果您的负载正在提供整数 SIMD 指令,您可能需要movdqu, 虽然movups机器码少了 1 个字节。有些CPU可能关心不同类型负载的“域交叉”。对于商店来说没关系,许多编译器总是使用movups即使对于整数数据。


也可以看看如何准确地对 x86_64 上的未对齐访问速度进行基准测试有关未对齐负载成本的更多信息。 (SIMD 和其他)。

如果没有连续的,你最好的选择是

  • movq xmm0, [v0]: 移动四字
  • movhps xmm0, [v1]: 移动高压缩单精度浮点。 (没有等价的整数,无论​​如何使用这个。永远不要使用movhpd,时间更长没有任何好处,因为没有 CPU 关心 double 与 float shuffle。)

或者在旧的 x86 上,例如 Core2 和其他旧的 CPU,其中movups即使 16 个字节都来自同一缓存行,速度也很慢,您可以使用

  • movq xmm0, [v0]: 移动四字
  • movhps xmm0, [v0+8]: 移动高压缩单精度浮点

movhps比稍微有效SSE4.1 pinsrq xmm0, [v1], 1(2 uop,无法在 Intel Sandybridge 系列上进行微熔丝:1 uop 用于负载端口,1 个用于端口 5)。movhps是 1 个微融合 uop,但仍然需要相同的后端端口:加载 + 洗牌。

请参阅 Agner Fog 的 x86 优化指南;他有一章是关于 SIMD 的,其中很大一部分是关于数据移动的。https://agner.org/optimize/并查看其他链接https://stackoverflow.com/tags/x86/info.


为了取回数据,movups可以作为商店,也可以movlps/movhps分散 qword 的两半。 (但不要使用movlps作为负载 - 它合并创建了错误的依赖关系与错误的依赖关系。movq or movsd.)

movlps比 短 1 个字节movq,但两者都可以将 xmm 寄存器的低 64 位存储到内存中。编译器通常会忽略存储的域交叉(vec-int 与 vec-fp),因此您也应该:通常使用 SSE1...ps当它们与商店完全相同时的说明。 (不适用于 reg-reg 移动;Nehalem 可以放慢速度movaps整数 SIMD 之间,如paddd, 或相反亦然。)

在所有情况下,据我所知,没有 CPU 关心float vs. double对于除实际加法/乘法指令以外的任何指令,没有具有单独的CPUfloat and double绕过转发域。 ISA 设计保留了该选项,但实际上,通过使用来节省字节永远不会受到惩罚movups or movaps围绕向量进行复制double。或者使用movlps代替movlpd. double随机播放有时很有用,因为unpcklpd就好像punpcklqdq(交错 64 位元素)与unpcklps就像punpckldq(交织 32 位元素)。

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

如何将两个打包的 64 位四字加载到 128 位 xmm 寄存器中 的相关文章

随机推荐

  • Facebook 连接对话框弹出窗口

    当使用 连接 facebook 连接按钮时 当我单击它时 它会在当前窗口之外打开一个新的弹出窗口 这很烦人 我如何才能使用大多数网站上的内联模式对话框 我附上了一个示例网站 看看您是否可以利用它来制作任何东西 http www gigloc
  • 在 C 中从布尔值设置位掩码的快速方法

    执行检查并设置 清除标志是很常见的 例如 if some test flag SOME FLAG else flag SOME FLAG 到目前为止我发现的一个方便的方法是 flag some test flag SOME FLAG fla
  • 使用 Pyomo 或 cvxpy 预测建筑物的功率(模型预测控制)

    我有室外温度的数据 8 2 10 13 并且我有我的建筑物的热惯性 8h 限制之一是将我的建筑物的内部温度保持在 20 度以内 我们从平衡状态开始 T in 20 T o 20 但一小时内的 T o 18 因此 Delta T o 18 度
  • 在 Meteor 中指定内容类型 (JavaScript)

    如何在 Meteor 中指定内容类型 我有一个返回 JSON 的页面 但响应标头是html text我需要做到application json 我在用iron router然后通过模板显示json 我只需要更改该页面的响应标头 我该怎么做
  • 是否有可能以这种方式使用 AGG 函数进行 SQL 查询?

    假设我有以下聚合函数 AGG1 AGG2 AGG3 AGG4 是否可以像这样编写有效的 SQL 以与数据库无关的方式 SELECT COL1 COL2 AGG1 param1 AGG2 param2 FROM SOME TABLES WHE
  • Laravel 4 Ajax 检查以包含 XMLHttpRequest (来自 Magnific Popup)

    Using 这个问题的代码 extends layouts isset ajax ajax master 检查 Ajax 它适用于常规 Ajax 页面加载 但不适用于使用弹出窗口 在本例中 我使用 Magnific Popup 的 Ajax
  • 序列元组

    我想将一系列类存储到一个元组中 并将该序列声明为另一个类的成员 template
  • HQL 加入 Grails:Part Deux

    这是我问的问题的延伸here 我有这样的关系 class Foo static hasMany bars Bar class Bar Has nothing to tie it back to Foo or Thing class Thin
  • EF7 beta5:外键返回空值

    我使用 ASP NET5 和 Entity Framework 7 0 0 beta 5 创建了一个 API 我创建了模型 DbContext 和存储库 当我尝试从数据库检索数据时 我得到了除外键数据之外的所有数据 外键值始终为空 数据库上
  • Google Apps 脚本 - 可能的图表类型

    我是 Google Apps 脚本的新手 所以我只是在探索我想要实现的目标是否可能 我需要从 Google 表单中检索并在单独的文档中显示根据每个单独表单提交的数据创建的图表 我知道这是可以做到的 我遇到的问题是我想要的图表类型似乎不可用h
  • 检查提交表单时至少选中一个复选框

    我有一个由复选框字段组成的表单 现在在表单提交时我们应该检查是否至少选中了一个复选框 html代码
  • Linux 在编译时随机删除了我的文件,我该怎么办?

    gcc L root Desktop Wall o prog3 c pthread lcopy usr lib gcc x86 64 linux gnu 7 x86 64 linux gnu Scrt1 0 In function star
  • Office 365 Rest API - 检索纯文本电子邮件

    目前是否可以使用 Office 365 Rest API 来检索电子邮件的纯文本部分 从 API 文档中可以看出 Body 对象包含 ContentType 字段 该字段可以是Text or HTML https msdn microsof
  • 模拟 Hibernate 会话

    我试图模拟休眠会话 这是我尝试过的代码片段 Before public void setUp campaignModel DraftTestHelper buildDraftModel if sessionFactory null Syst
  • 每次 ajax 调用后不同的 Facebook 评论框

    我的问题是这样的 我有一个网页 每次用户单击按钮时该网页都会发生变化 标题已更新 图表 鉴于页面现在有不同的内容 我希望有一个不同的评论部分 但是 url 是完全相同的 因为所有内容都是 ajax 加载的 所以我想知道是否也可以生成一个新的
  • FormData 无法在 Internet Explorer 中工作?

    function uploadPhoto file if file file type match image if file postStatus else return var fd new FormData fd append ima
  • get_path() 从 matplotlib.patches 返回一个 Circle

    有谁知道是什么get path of a Circle from matplotlib patches回报 这get path 圆的返回值与原始圆不同 这可以从下面代码的结果中看出 从附图中可以看出 原来的橙色圆圈与图中的蓝色圆圈完全不同
  • ffmpeg 中的 mp3 音频 + 背景.jpg = 结果.mp4

    将视频转换为 mp4 以上传到 YouTube 时遇到问题 我已使用以下命令转换为 avi 格式 ffmpeg y i background jpg i deepmix mp3 c a copy result avi 但是当我将其上传到 y
  • 如何使用 JDBC 调用 PostgreSQL 存储过程

    我正在使用 postgresql 并且创建了一些存储过程 现在我想通过jdbc访问存储过程并处理结果 存储过程的结果是整数或表 我发现了以下内容 CallableStatement upperProc conn prepareCall ca
  • 如何将两个打包的 64 位四字加载到 128 位 xmm 寄存器中

    我有两个 UInt64 即 64 位四字 整数 它们与 8 字节对齐 sizeof UInt64 边界 如果这对任何事情有用的话 我也可以将它们对齐到 16 字节 它们被挤在一起 所以它们在内存中是并排的 我如何将它们加载到 xmm 寄存器