SSE向量化与内存对齐的关系

2023-12-06

为什么 SSE/AVX 需要对齐内存?

我经常得到的答案之一是对齐的内存加载比未对齐的内存加载快得多。那么,为什么这种对齐的内存加载比未对齐的内存加载快得多呢?


这不仅仅是 SSE(甚至 x86)特有的。在大多数架构上,加载和存储需要自然对齐,否则它们要么(a)生成异常,要么(b)需要两个或更多周期加上一些修复,以便透明地处理未对齐的加载/存储。在 x86 上,(b) 对于

您可能想知道:为什么不只使用这些 SSE 加载/存储指令的未对齐版本,而不管对齐情况如何?答案是,这些指令通常比对齐的对应指令慢得多,因为它们通常按照上面 (b) 的方式运行,这使得它们通常慢 2 倍或更多,除了最近的 Intel CPU(例如 Core i7),其惩罚要小得多,但并非微不足道。

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

SSE向量化与内存对齐的关系 的相关文章

  • 跨 AVX 通道的最佳方式是什么?

    有些问题具有类似的标题 但我的问题涉及其他地方未涵盖的一个非常具体的用例 我有 4 个 128d 寄存器 x0 x1 x2 x3 我想将它们的内容重新组合在 5 个 256d 寄存器 y0 y1 y2 y3 y4 中 以准备其他计算 on
  • 优化数组压缩

    假设我有一个数组k 1 2 0 0 5 4 0 我可以按如下方式计算掩码m k gt 0 1 1 0 0 1 1 0 仅使用掩码 m 和以下操作 左移 右移 And Or 加 减 乘 我可以将 k 压缩为以下形式 1 2 5 4 以下是我目
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 使用 AVX 内在函数代替 SSE 并不能提高速度 - 为什么?

    我已经使用 Intel 的 SSE 内在函数相当长一段时间了 并取得了良好的性能提升 因此 我希望 AVX 内在函数能够进一步加速我的程序 不幸的是 直到现在情况并非如此 可能我犯了一个愚蠢的错误 所以如果有人能帮助我 我将非常感激 我使用
  • 大数组上的 SSE 性能较慢

    我是 SSE 编程新手 所以我希望有人可以帮助我 我最近使用 GCC SSE 内在函数实现了一个函数来计算 32 位整数数组的总和 下面给出了我的实现代码 int ssum const int d unsigned int len stat
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 使用 AVX/AVX2 转置 8x8 浮点

    转置 8x8 矩阵可以通过制作四个 4x4 矩阵并对每个矩阵进行转置来实现 这不是我想要的 在另一个问题中 一个答案给出了解决方案 https stackoverflow com a 2518670 4144148x8 矩阵只需要 24 条
  • 何时可以重用avx指令中的源寄存器

    在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用 例如 我想使用vgatherdps该指令消耗两个 ymm 寄存器 其中之一是位移索引 我意识到vgatherdps由于数据的局部性较差 因此需要花费大量时间来收集 位移索引寄存器
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101
  • 除了 gcc 之外,还有哪些编译器可以对代码进行向量化?

    GCC can 矢量化循环 ftp gcc gnu org pub gcc summit 2004 Autovectorization pdf当指定某些选项并给出正确的条件时 会自动进行 是否还有其他广泛可用的编译器可以执行相同的操作 IC
  • 是否有适用于双打 (__m128d) 的 Move (_mm_move_ss) 和 Set (_mm_set_ss) 内在函数?

    多年来 我有几次看到 in 中的内在函数float参数被转换为 m128使用以下代码 m128 b mm move ss m mm set ss a 例如 void MyFunction float y m128 a mm move ss
  • 将 XMM 寄存器压入堆栈

    有没有办法将打包双字整数从 XMM 寄存器推送到堆栈 然后在需要时将其弹出 理想情况下 我正在寻找通用寄存器的 PUSH 或 POP 之类的东西 我已经检查了英特尔手册 但我要么错过了命令 要么没有 或者我是否必须将值解压到通用寄存器然后推
  • 在 SSE 和 AVX512 寄存器之间移动数据?

    我想将四个 xmm 寄存器移动到一个 zmm 寄存器中 使用 AVX512 指令执行一些计算并将结果返回到 XMM 寄存器 不通过内存来做到这一点的最有效方法是什么 None
  • 添加饱和 32 位有符号整数内在函数?

    有人可以推荐一种使用 Intel 内在函数 AVX SSE4 添加饱和 32 位有符号整数的快速方法吗 我查看了内在指南并发现 mm256 adds epi16但这似乎只添加 16 位整数 我没有看到 32 位有任何类似的东西 其他电话似乎
  • 当行大小大于向量宽度时 SIMD 转置

    你可以找到很多good https stackoverflow com a 25625919 149138 answers https stackoverflow com a 29587984 149138用于转置一个矩阵 该矩阵落在nat
  • 英特尔 SSE:为什么 `_mm_extract_ps` 返回 `int` 而不是 `float`?

    为什么 mm extract ps返回一个int代替float 读单的正确方法是什么float来自 C 中的 XMM 寄存器 或者更确切地说 另一种询问方式是 其相反的是什么 mm set ps操作说明 所有答案似乎都没有真正回答问题 wh
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 对齐类型并按值传递参数

    按值传递对齐类型或具有对齐类型的结构不适用于某些实现 这会破坏 STL 容器 因为某些方法 例如 resize 按值获取参数 我使用 Visual Studio 2008 运行了一些测试 但不完全确定按值传递何时以及如何失败 我主要关心的是
  • 帮助我改进更多 SSE2 代码

    我正在寻找一些帮助来改进 core2 cpu 上的双线性缩放 sse2 代码 在我的 Atom N270 和 i7 上 此代码比 mmx 代码快大约 2 倍 但在 core2 cpu 下它只等于 mmx 代码 代码如下 void Conve
  • 用于 GNU C++ 的 SSE SSE2 和 SSE3 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一个简单的教程可以帮助我快速掌握 GNU C 中的 SSE SSE2 和 SSE3 如何在SSE中

随机推荐

  • __has_cpp_attribute 不是“类似函数”的宏?

    我正在尝试介绍 deprecated 属性到我的代码库中 然而 并不是所有我需要支持的编译器都支持这种语法 标准化之前不同编译器使用的各种方法在属性标准化提案 N2761 因此 我尝试使用此属性有条件地编译 has cpp attribut
  • Python NameError:名称未定义(与默认输入参数类型有关)

    我对我打电话的事实有疑问len myByteArray 在我声明的函数的输入参数中 我希望它成为默认参数 但 Python 似乎不喜欢它 myByteArray属于类型bytearray See 关于 bytearray 的文档在这里 我正
  • 将闭包存储在 HashMap 中

    为了学习 Rust 语言 我使用了一个旧的 C 库并尝试将其转换为 Rust 它使用了很多 C 11 闭包 我在翻译这些概念时遇到了一些困难 在 C 中我有这样的事情 library h struct Event just some dat
  • 使用 vlc 的 Python QT 应用程序不显示全屏

    我正在开发一个应用程序 其中显示多个 vlc 流 rtsp 通过双击其中一个流 该流应该全屏显示 该应用程序是使用 pyqt5 和 vlc qt 的 python 3 7 代码如下 import sys import vlc from Py
  • 从 Visual Studio 2015 中完全删除 ApplicationInsights

    我环顾四周 并没有找到一个好的答案 所以我发布这个问题 希望它可以成为其他希望完全删除 Application Insights 的人的一种 参考 我尝试的第一个显而易见的事情是从 工具和扩展 中卸载该工具 但不幸的是 这让事情变得更糟 现
  • 按价格列对表格进行排序

    这是账单清单 Service Price S1 13 CHF S2 Free S3 Free S4 40 CHF 我想使用 jQuery 或纯 JavaScript 按价格对其进行排序 不是服务器端 I tried jQuery 表排序器
  • 从浏览器中检测 USB 设备是否已插入 Javascript

    是否有基于 Javascript 的机制 我可以通过浏览器检测用户是否插入了特定的 USB 设备 出于安全原因 Web 浏览器中的 JavaScript 仅提供受限制的访问计算机资源 这是不可能将文件存储在任意文件夹中 启动应用程序或与US
  • mod_rewrite php mysql

    我对 mod rewrite 非常陌生 我一直在试图解决这个问题 但真的很困难 p 这是我的问题 我有一个页面http example com user s 81 s 81 正在从数据库中的用户 ID 读取 我想要的是一个链接 http e
  • Request.QueryString 为空时出错

    有时用户会错误地重定向到 Process ViewImages PAGEID 发生这种情况时 他们会收到以下错误 Microsoft VBScript 运行时错误 800a000d 类型不匹配 字符串 FLPM cp images cs a
  • C malloc 只为 int * 分配了 8 个字节 [重复]

    这个问题在这里已经有答案了 我正在尝试创建一个指向6元素int在函数中稍后返回它 因此为此目的我使用malloc 但它的表现似乎并不符合我的预期 这是代码 int j 0 for j lt 5 j int intBig malloc j s
  • C 编译器错误 - 初始值设定项不是常量

    我有一个用于创建新的函数GQueue GQueue newGQueue int n ele int ele size GQueue q GQueue malloc sizeof GQueue if q return NULL q gt pt
  • 直接从指针转换为模板函数?

    我试图获取指向函数模板实例的指针并将其转换为 void include
  • DataGrid 显示图像的路径而不是图像本身

    以下几行最终显示路径而不是它通向的图像 AutoGenerateColums 设置为 true 将其设置为 false 最终会出现完全空的行 System Data DataTable DataTable new System Data D
  • 如何在 React Native 上向 BottomTabNavigator 添加按钮?

    我的目标是同时拥有顶部和底部导航栏Home Dashboard and Album 但不适合SignIn 问题是 我希望将按钮放在底部而不是顶部 最后剩下的难题是如何添加Sign In按钮到底部导航栏 障碍是如果你写
  • 如何在一个窗口上绘制多个 FacetGrid?

    在下面的代码中 我可以通过传递在一个窗口中放置两个简单的seaborn图ax ax i 每个论据都不起作用FacetGrid 类似问题已被问过here 想知道是否有人知道如何做到这一点 谢谢 import pandas as pd impo
  • 不使用 MPMoviePlayer 在 iPhone 上制作动画图像(如电影)的方法

    我需要能够在静态图像上显示动画 鉴于 MPMoviePlayer 无法让您控制任何有用的东西 我认为做到这一点的唯一方法是使用多个静态图像 我们 逐一 显示这些图像以创建 类似电影 的动画 我知道我们可以使用 UIImageView 来做到
  • 仅纵向模式 - iOS

    我有一个应用程序 专为纵向设计 但是我不知道如何限制只使用纵向模式 一旦用户颠倒或横向模式 我不希望我的屏幕方向相应地改变 有什么想法如何去做吗 可以通过重写此方法在应用程序摘要 以及 rootviewcontroller 无论是导航控制器
  • 单位有哪些类型? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人知道有什么好的参考资料吗 谢谢 蒂姆 Null 参考类型的底部类型 无 所有类型的底部类型 单位 表示没有结果的类型
  • C 中链表何时使用 NULL,何时使用 '\0'?

    我在 C 中了解到 null char 0 NULL 我在下面编写了一个循环 从 C 中的 char 的开头到结尾进行读取 case 1 char buf 32 while buf i NULL do something 然而 我的 gcc
  • SSE向量化与内存对齐的关系

    为什么 SSE AVX 需要对齐内存 我经常得到的答案之一是对齐的内存加载比未对齐的内存加载快得多 那么 为什么这种对齐的内存加载比未对齐的内存加载快得多呢 这不仅仅是 SSE 甚至 x86 特有的 在大多数架构上 加载和存储需要自然对齐