为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

2024-05-03

在尝试优化有限差分代码所需的未对齐读取时,我更改了未对齐的负载,如下所示:

__m128 pm1 =_mm_loadu_ps(&H[k-1]);

进入这个对齐的读取+随机播放代码:

__m128 p0   =_mm_load_ps(&H[k]);
__m128 pm4  =_mm_load_ps(&H[k-4]);
__m128 pm1  =_mm_shuffle_ps(p0,p0,0x90);   // move 3 floats to higher positions
__m128 tpm1 =_mm_shuffle_ps(pm4,pm4,0x03); // get missing lowest float
       pm1  =_mm_move_ss(pm1,tpm1);        // pack lowest float with 3 others

where H16 字节对齐;并且也有类似的变化H[k+1], H[k±3] and movlhps & movhlps优化为H[k±2] (here http://paste.ubuntu.com/7306179/'是循环的完整代码)。

我发现在我的 Core i7-930 上优化了阅读H[k±3]似乎是富有成效的,同时添加了下一个优化±1减慢了我的循环速度(以百分比为单位)。之间切换±1 and ±3优化并没有改变结果。

同时,在 Core 2 Duo 6300 和 Core 2 Quad 上启用两种优化(对于±1 and ±3)提高了性能(百分之几十),而对于 Core i7-4765T,这两者都降低了性能(以百分比为单位)。

在 Pentium 4 上,所有优化未对齐读取的尝试,包括那些movlhps/movhlps导致放缓。

为什么不同的CPU会有这么大的差异呢?是否是因为代码大小增加导致循环可能不适合某些指令缓存?或者是因为某些 CPU 对未对齐读取不敏感,而其他 CPU 则更敏感?或者诸如洗牌之类的操作在某些 CPU 上可能很慢?


英特尔每两年都会推出一种新的微架构。执行单元的数量可能会发生变化,以前只能在一个执行单元中执行的指令在较新的处理器中可能有 2 或 3 个可用。指令的延迟可能会改变,就像当shuffle添加执行单元。

英特尔在其优化参考手册中介绍了一些详细信息,这是链接,下面我复制了相关部分。

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf

section 3.5.2.7 浮点/SIMD 操作数

来自内存的 MOVUPD 指令执行两个 64 位加载,但需要额外的 μop 来调整地址并将加载组合到单个寄存器中。使用 MOVSD XMMREG1、MEM 可以获得相同的功能; MOVSD XMMREG2,MEM+8; UNPCKLPD XMMREG1、XMMREG2,使用更少的μops,可以更有效地打包到跟踪缓存中。已发现后一种替代方案在某些情况下可提供几个百分点的性能改进。它的编码需要更多的指令字节,但这对于 Pentium 4 处理器来说很少是问题。 MOVUPD 的存储版本复杂且缓慢,因此应始终使用具有两个 MOVSD 和一个 UNPCKHPD 的序列。

汇编/编译器编码规则 44。(ML 影响,L 通用性)对于未对齐的 128 位负载,不要使用 MOVUPD XMMREG1, MEM,而是使用 MOVSD XMMREG1, MEM; MOVSD XMMREG2,MEM+8; UNPCKLPD XMMREG1、XMMREG2。如果附加寄存器不可用,则使用MOVSD XMMREG1、MEM; MOVHPD XMMREG1,MEM+8。

汇编/编译器编码规则 45。(M 影响,ML 通用性)不要使用 MOVUPD MEM, XMMREG1 进行存储,而是使用 MOVSD MEM, XMMREG1; UNPCKHPD XMMREG1、XMMREG1; MOVSD MEM+8,改为 XMMREG1。

section 6.5.1.2 数据混合

将数据从 SoA 转换为 AoS 格式可应用于许多应用领域,包括 3D 几何、视频和成像。可以采用两种不同的混合技术来处理浮点和整数数据。例 6-3 说明了使用 SHUFPS、MOVLHPS、MOVHLPS 指令的 swizzle 函数。

例 6-3 中的技术(加载 16 个字节,使用 SHUFPS 并复制 XMM 寄存器的一半)优于在较新的微架构上使用 MOVLPS/MOVHPS 加载每个向量的一半的替代方法。这是因为使用 MOVLPS/MOVHPS 加载 8 个字节会产生代码依赖性并降低执行引擎的吞吐量。示例 6-3 和示例 6-4 的性能考虑因素通常取决于每种微架构的特性。例如,在 Intel Core 微架构中,执行 SHUFPS 往往比 PUNPCKxxx 指令慢。在增强型英特尔酷睿微架构中,由于 128 位混洗执行单元,SHUFPS 和 PUNPCKxxx 指令均以 1 个周期吞吐量执行。那么下一个重要的考虑因素是只有一个端口可以执行PUNPCKxxx vs MOVLHPS/MOVHLPS 可以在多个端口上执行。由于具有 3 个用于执行 SIMD 指令的端口,这两种技术的性能在 Intel Core 微架构上均优于以前的微架构。由于采用了 128 位混洗单元,这两种技术都在增强型英特尔酷睿微架构上得到了进一步改进。

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

为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然? 的相关文章

  • 使用map.get()时使用java Map.containsKey()是多余的

    一段时间以来 我一直想知道在最佳实践中是否允许避免使用containsKey 方法上java util Map而是对结果进行空检查get 我的理由是 两次查找值似乎是多余的 首先是查找containsKey 然后再次为get 另一方面 大多
  • 在汇编中,指令指定数据类型吗?

    我是汇编语言编程 x86 的初学者 以下说法是否正确 在汇编中 BYTE WORD DWORD 等数据类型分别表示 8 位 16 位和 32 位模式 而不仅仅是整数 它们本身没有意义 它们只是位模式 使用它们的指令赋予了它们意义 汇编 代码
  • 使用实际值检查 cvxpy 中的约束是否正确

    在 cvxpy 中解决优化问题时 是否有一种好方法可以通过用实际值替换优化变量来检查约束是否有效 我有一个复杂的优化问题 100 多个约束 但我知道最佳解决方案应该是什么 但是 cvxpy 失败并显示错误消息ValueError Rank
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 将 1 字节立即值添加到 2 字节内存位置

    The add说明文档来 自这一页 http x86 renejeschke de html file module x86 id 5 html说如下 请注意我突出显示的两条说明 我在 NASM 中尝试了以下代码 符合第一个突出显示的指令
  • 优化视图状态

    是否有人对优化 ASP NET 应用程序的视图状态有任何想法或参考可以向我指出 我不想把它全部关闭 优化它的主要目标是提高性能 所以我不想运行一个昂贵的函数来递归地禁用某些控件的视图状态 因为该函数会减慢速度页面的加载时间会达不到目的 有任
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 我可以使用 AVX FMA 单元进行位精确的 52 位整数乘法吗?

    AXV2 doesn t have any integer multiplications with sources larger than 32 bit It does offer 32 x 32 gt 32 http www felix
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 与保留模式 GUI 相比,使用立即模式 GUI 对性能有何影响?

    我目前正在开发一个标准的 Windows 桌面应用程序 标准意味着没有花哨的东西 只是按钮 文本 滑块等 在研究了一些 GUI 框架并被拒绝后 我决定自己编写一个 GUI 框架他们全部 由于这是一个业余爱好项目 我也愿意尝试 并决定将 GU
  • MFENCE/SFENCE/etc“序列化内存但不序列化指令执行”?

    英特尔系统编程指南第 8 3 节中有关 MFENCE SFENCE LFENCE 的说明 以下指令是内存排序指令 而不是序列化指令 这些指令会耗尽数据内存子系统 它们不序列化指令执行流 我试图弄清楚为什么这很重要 在多线程代码中 对内存的写
  • try-catch 块是否会降低性能[重复]

    这个问题在这里已经有答案了 This link http www cplusplus com doc tutorial exceptions states 为了捕获异常 我们必须将一部分代码放在异常下 检查 这是通过将这部分代码包含在 tr
  • SSE:如何将 _m128i._i32[4] 减少到 _m128i._i8

    我对 SSE 编码非常陌生 我想将 int32 类型的 m128i 4 的结果存储到 int8 类型的 m128i 中 m128i j i32 k 的值均在 127 和 127 之间 我认为伪代码如下 result i8 vec1 i8 0
  • 高效秒表

    您好 我正在用 javascript 编写一个秒表实用程序 我有一个关于效率和开销的问题 我考虑过两种制作秒表的方法 1 存储开始日期并不断测量自该日期以来经过的毫秒数 2 创建一个整数并按设定的时间间隔递增其值 我想知道哪个最有效 另外
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组
  • 生成尽可能最快的可执行文件

    我有一个非常大的程序 我一直在 Visual Studio 下编译 v6 然后迁移到 2008 我需要可执行文件尽可能快地运行 该程序大部分时间都花在处理各种大小的整数上 并且执行很少的 IO 显然 我会选择最大优化 但似乎可以做很多不属于

随机推荐

  • 在 SQL 中将 CSV 字段拆分为不同的行

    我的一位同事在做COBOL程序时遇到了这个问题 最终在应用程序层面解决了它 我仍然很好奇是否可以使用 SQL 在数据访问级别上解决它 这在某种程度上与这另一个问题 https stackoverflow com questions 2903
  • 来自 Popover 的 UIActionSheet 和 iOS8 GM

    有人在尝试从弹出窗口显示 UIActionSheet 时收到此消息吗 您的应用程序呈现了 UIAlertController 样式的 UIAlertControllerStyleActionSheet 具有此样式的 UIAlertContr
  • 关闭 MediaStyle 通知

    Lollipop 中的新 Android MediaStyle 通知没有关闭按钮 看起来 Google Code 上已经存在一个错误 在错误解决之前 有谁知道解决此问题的好方法是什么 我们应该推迟切换到 MediaStyle 吗 或者使用其
  • C# 窗口形式的漂亮图形

    我需要使用 C 在 Windows 窗体中创建一些简单的图形 简单地说 我指的是线条 圆圈等 但是 当我画画时 例如实心圆 边缘不平滑 正如使用方形像素绘制圆时所预期的那样 但是当在矢量程序中使用相同数量的像素绘制相同的圆时 它看起来很完美
  • 将 JSTL 添加到 jsp (Tomcat 8) [重复]

    这个问题在这里已经有答案了 我想在我的 jsp 中使用 JSTL 库 现在我按照教程进行操作 它告诉我将此行添加到 jsp 页面 它给我错误无法解析 taglib 与 uri 然后是 URL 我正在运行 tomcat 8 我的 web xm
  • 对不同长度的数组使用 setValues()

    我在 Google Apps 脚本中有一个二维数组 其中包含不同长度的数组 我想在电子表格中设置数组的值 但是 由于其中的数组长度不同 我收到一个错误 本质上是说范围和数组高度不对齐 我在下面列出了数组结构的示例 如果我向每个单独的数组添加
  • Swift3:如何处理优先组现在运算符应该用主体声明?

    以前的 Swift 3 运算符代码是 infix operator associativity left precedence 150 但现在 根据 Xcode 8 beta 6 这会生成以下警告 operator should not b
  • 打印堆栈指针的值

    如何在 Linux Debian 和 Ubuntu 中用 C 打印堆栈指针的当前值 我尝试谷歌但没有找到结果 一个技巧是简单地将本地地址作为指针打印出来 但它不可移植 甚至无法保证有效 void print stack pointer vo
  • Angularjs 1.2.x Injector:添加 ngRoute 后即使出现 modulerrr 错误

    我正在自学 AngularJS 但似乎无法解决这个错误 我尝试过排除故障 放弃了 这就是我得到的 索引 html div div main js var app angul
  • 在 Python 3.2 中使用 HTMLParser

    我一直在使用 HTML 解析器从网站中抓取数据并剥离 html 编码 我知道各种模块 例如 Beautiful Soup 但决定走不依赖 外部 模块的道路 Eloff 提供了一个代码 在 Python 中从字符串中去除 HTML https
  • Java中的静态最终变量[重复]

    这个问题在这里已经有答案了 可能的重复 私有最终静态属性与私有最终属性 https stackoverflow com questions 1415955 private final static attribute vs private
  • C++ 中的 CPUID 实现

    我想知道这里是否有人有一些可以从任何托管 net 语言引用的 C CPUID 实现的好示例 另外 如果情况并非如此 我是否应该注意 X86 和 X64 之间的某些实现差异 我想使用 CPUID 来获取运行我的软件的机器上的信息 崩溃报告等
  • C# 中的 SQL 更新语句

    我有桌子 学生 P ID LastName FirstName Address City 1 Hansen Ola 2 Svendson Tove 3 Petterson Kari 4 Nilsen Johan and so on 如何更改
  • SQL Select 使某个值仅出现一次

    对于那些一直在这个 Twitter 克隆上帮助我的人 谢谢你们 在您的帮助下 我已经成功地完成了大部分工作 现在终于完成了关注者功能的最后一步 现在 我有一个包含以下字段的数据集 用户名 推文 日期 数据示例可能如下所示 Username
  • Chrome 和 Firefox 之间的 Rems 渲染方式不同

    在比较 Chrome 和 Firefox 中的渲染方式时 我注意到使用 rems 时存在一个小问题 使用以下 CSS html font size 62 5 rem test width 50 height 20rem background
  • 某些列值驻留在其他表中的外键约束

    在 PostgreSQL 中表达外键约束 其中部分 FK 列驻留在另一个表中 的正确 惯用方法是什么 我将用一个例子来阐明这一点 为了简短起见 省略了一些明显的 PK 和 FK 我们希望对书籍 书中发现的主题 阅读事件 其中阅读一本书 和阅
  • 如何使用 Access 2013 将 ADP 转换为 ACCDB?

    Access 2013 不支持 ADP 给出了 ADP 的一些替代方案 将 ADP 转换为链接的 Access Desktop 数据库 将对象导入 ACCDE 文件 然后使用早期版本的 Access 创建现有数据的链接表 我的 ADP 仅包
  • 带有 case OR 运算的 VB.NET select case 语句逻辑是什么?

    我正在使用一个Or https msdn microsoft com en us library 06s37a7f aspx我的案例表达式中的声明 尽管我有一个在此范围内的值 但它没有找到匹配项 为什么不 示例代码 Select Case
  • twisted-suds 的优点 - 使用 python suds 肥皂库的异步方式

    我正在使用Pythonsuds https fedorahosted org suds 用于基于本地 wsdl 文件制作 SOAP 客户端的库 我的目标是使用 Twisted 作为后端 以便我以异步方式查询 SOAP 服务器 我知道这个话题
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load