混洗两个 __m128i 的 64 位部分的最佳方法

2024-04-01

我有两个__m128is, a and b,我想进行洗牌,以便高 64 位a落在低 64 位dst和低 64 位b落在上64dst. i.e.

dst[ 0:63]  = a[64:127]
dst[64:127] = b[0:63]

相当于:

__m128i dst = _mm_unpacklo_epi64(_mm_srli_si128i(a, 8), b);

or

__m128i dst = _mm_castpd_si128(mm_shuffle_pd(_mm_castsi128_pd(a),_mm_castsi128_pd(b),1));

有比第一种方法更好的方法吗?第二条指令只有一条指令,但切换到浮点 SIMD 执行比第一条指令的额外指令成本更高。


延迟并不总是最糟糕的事情。如果它不是循环携带的 dep-chain 的一部分,则只需使用单个指令。

而且,也可能没有!阿格纳·福格微架构文档 http://agner.org/optimize/说他在 Sandybridge 上使用“错误”类型的 shuffle 或布尔值时,在某些情况下没有发现额外的延迟。混合仍然有额外的延迟。他表示,在 Haswell 上,混合类型的随机播放根本没有额外的延迟。 (第 140 页,数据旁路延迟。)

所以继续使用shufps,除非您非常关心您的代码在 Nehalem 上的运行速度。 (以前的设计(merom/conroe 和 Penryn)没有因使用错误的移动或洗牌而产生额外的旁路延迟。)

对于AMD来说,shufps运行在ivec域中,与整数洗牌相同,所以使用它就可以了。与 Intel 一样,FP 混合在 FP 域中运行,因此 FP 数据没有旁路延迟。

如果您根据支持的指令集包含多个 asm 版本,而不像 x264 那样完全热衷于为每个 CPU 提供最佳版本,那么您可能会在 AVX CPU 的版本中使用错误类型的操作,但使用多个指令在您的非 AVX 版本中。 Nehalem 具有较大的惩罚(每个域转换有 2 个周期旁路延迟),而 Sandybridge 为 0 或 1 个周期。 SnB 是带有 AVX 的第一代。

Nehalem 之前的版本(没有 SSE4.2)太旧了,以至于可能不值得专门为其调整版本,即使它对“错误类型”洗牌没有任何惩罚。 Nehalem 正处于速度有点慢的边缘,因此在这些系统上运行的软件将很难实时运行,或者感觉不慢。因此,对 Nehalem 的不好会增加糟糕的用户体验,因为他们的系统已经不是最快的了。

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

混洗两个 __m128i 的 64 位部分的最佳方法 的相关文章

随机推荐

  • WSO2 DAS 是 WSO2 BAM 的新名称还是后续产品?

    我们正在评估 WSO2 API Manager 1 8 0 WSO2 AM 和 WSO2 Business Activity Monitor 2 5 0 WSO2 BAM 从我们的支持合作伙伴 Yenlo 处 我们得到了 WSO2 建议 建
  • 如何使用 sql server management studio 将 blob 插入数据库

    如何轻松地将 blob 插入到varbinary MAX field 举个例子 我要插入的是 c picture png该表是我的表该列是 mypictureblob这个地方是recid 1 您可以在 SQL Server Manageme
  • 如何更改 Eclipse for Android 中的 Control+Space 自动完成快捷键

    当我在 Android xml 文件 例如活动菜单 中并输入 android 然后会弹出自动完成功能 我可以选择一个选项 但是 如果我有类似的东西 android showAsAction 将光标放在引号内 然后我不会自动完成引号内的选项
  • 解压大zst文件

    我有一个 16GB 的压缩 zst 文件 我该如何在windows上解压它 我没有内存来处理解压版本 因此需要将其直接写入文件 冒着听起来显而易见的风险 您需要一个支持 zstandard 的 Windows 解压缩器 At the zst
  • 基于 ATL 的链接器错误

    我最近遇到了 atls lib 的链接问题 我用以下内容更新了链接器的附加依赖项行 comctl32 lib C WinDDK 7600 16385 1 lib ATL i386 atls lib C WinDDK 7600 16385 1
  • 如何将十六进制字符串分配给 char[] 变量?

    假设我的十六进制字符串 hexStr aecf 如何将十六进制字符串值分配给unsigned char myChar 如下 谢谢 myChar 0 0xae myChar 1 0xcf 您可以按如下方式转换数据 char hexstr ae
  • 如何创建可以使用 rundll32.exe 运行而无需指定入口点的本机 C++ DLL

    我将如何创建一个可以使用 rundll32 exe 执行的本机 dll不指定入口点 例子 C gt rundll32 exe mydll dll 我在 Visual Studio 上创建了一个 DLL 项目 但我不知道在哪里放置我的代码 V
  • 对 15 个谜题状态进行哈希处理的有效方法的想法

    我正在通过蚁群优化实现一个 15 谜题求解器 并且正在考虑一种有效地将每个状态散列为数字的方法 因此我浪费了最少的字节 状态由 16 个数字的列表表示 从 0 到 15 0 是空洞 Like 1 2 3 4 5 6 7 8 9 10 11
  • Oracle 处理很长的 IN 运算符列表的效率如何

    我有以下查询 这是一个更复杂的查询的简化版本 SELECT FROM TPM TASK WHERE PROJECTID VERSIONID IN 3 1 24 1 4 1 在代码中我将构建它 PROJECTID VERSIONID 以编程方
  • 对 PictureBox 的透明控制

    在我的 C 表单中 我有一个标签 显示下载事件中的下载百分比 this lblprg Text overallpercent ToString 0 Label 控件的 BackColor 属性设置为透明 我希望它显示在 PictureBox
  • Haswell 微架构在性能中没有停滞周期后端

    我在 Haswell CPU Intel Core i7 4790 上安装了 perf 但 性能列表 不包括 stalled cycles frontend 或 stalled cycles backend 我检查了http www int
  • 用底部三角形制作div

    我一直在努力做白色形状与一个div http sircat net joomla sircat mies 2 png http sircat net joomla sircat mies 2 png 如何获得 div 底部的对角线形状 我有
  • 在 JSON.NET 中序列化/反序列化字节数组

    我有一个具有以下属性的简单类 JsonObject MemberSerialization OptIn public class Person JsonProperty PropertyName Photograph public byte
  • 纯Python XSLT 库

    有没有纯Python 的XSLT 库 在我需要支持的某些平台上安装 libxml2 libxslt 或任何类似的 C 库是一个问题 我确实只需要基本的 XSLT 支持 速度不是主要问题 不幸的是 目前还没有纯 python XSLT 处理器
  • 提供语言服务的问题

    我发现了两种在互联网上提供语言服务的方法 第一种方式 http msdn microsoft com fr fr library vstudio bb166498 28v vs 110 29 aspx涉及使用IOleComponentMan
  • 将 Android 应用程序连接到远程数据

    谢什谈论的信息有限 我正在尝试让我的 Android 应用程序连接到在线数据库以访问信息 有相当多的信息 包括地理标签 这些信息将映射到我的应用程序上 开发者网站有非常丰富的信息 您可以使用网络 如果可用 在您自己的基于 Web 的服务上存
  • 将 PDF 表单数据接收到 PHP 中

    所以我在网上寻找了几个小时 我认为这是一个非常简单的答案 但我似乎找不到它 我试图了解 PDF 表单数据提交的工作原理 我的目标是读取从我设置到 PHP 脚本中的 PDF 表单提交的表单数据 我希望我的 PHP 脚本能够解析表单数据并将其插
  • Django 管理错误“WSGIRequest”对象没有属性“用户”

    我正在练习 Django 当我尝试去http localhost admin http localhost admin 我收到以下错误 我已检查 settings py 并且 MIDDLEWARE CLASSES 确实存在 是否还有其他原因
  • Apache NiFi 用于将数据从 RDMBS 导入到 HDFS - 与 SQOOP 的性能比较

    我们正在探索 Apache NiFi 作为满足我们企业需求的通用数据摄取工具 一种典型的数据摄取要求是从 RDBMS 移动数据 系统到 HDFS 我能够使用 NiFi 提供的GenerateTableFetch 和 ExecuteSQL 处
  • 混洗两个 __m128i 的 64 位部分的最佳方法

    我有两个 m128is a and b 我想进行洗牌 以便高 64 位a落在低 64 位dst和低 64 位b落在上64dst i e dst 0 63 a 64 127 dst 64 127 b 0 63 相当于 m128i dst mm