什么是“矢量化”?

2024-05-12

现在好几次了,我在 matlab、fortran ……其他一些……中遇到这个术语,但我从来没有找到解释它是什么意思,它有什么作用?所以我在这里问,什么是矢量化,例如“循环矢量化”是什么意思?


许多CPU具有“向量”或“SIMD”指令集,它们同时对两个、四个或更多个数据块应用相同的操作。现代x86芯片有SSE指令,许多PPC芯片有“Altivec”指令,甚至一些ARM芯片有向量指令集,称为NEON。

“矢量化”(简化)是重写循环的过程,这样它就不会处理数组的单个元素 N 次,而是同时处理(比如说)数组的 4 个元素 N/4 次。

我选择 4 是因为它是现代硬件最有可能直接支持 32 位浮点数或整数的值。


矢量化和循环展开之间的区别:考虑以下非常简单的循环,它将两个数组的元素相加并将结果存储到第三个数组。

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

展开这个循环会将其转换为如下所示:

for (int i=0; i<16; i+=4) {
    C[i]   = A[i]   + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}

另一方面,对其进行矢量化会产生如下结果:

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

其中“addFourThingsAtOnceAndStoreResult”是编译器用来指定向量指令的任何内部函数的占位符。


术语:

请注意,大多数现代的提前编译器都能够自动矢量化像这样非常简单的循环,通常可以通过编译选项启用(默认情况下在现代 C 和 C++ 编译器中进行完全优化,例如gcc -O3 -march=native)。开放MP#pragma omp simd有时有助于提示编译器,特别是对于“归约”循环,例如对 FP 数组求和,其中矢量化需要假装 FP 数学是关联的。

更复杂的算法仍然需要程序员的帮助来生成良好的矢量代码;我们称之为手动矢量化,通常与 x86 等内在函数一起使用_mm_add_ps映射到单个机器指令,如下所示Intel cpu 上的 SIMD 前缀和 https://stackoverflow.com/questions/10587598/simd-prefix-sum-on-intel-cpu or 如何使用 SIMD 计算字符出现次数 https://stackoverflow.com/questions/54541129/how-to-count-character-occurrences-using-simd。或者甚至使用 SIMD 来解决简短的非循环问题,例如将 9 个字符数字转换为 int 或 unsigned int 的最疯狂的最快方法 https://stackoverflow.com/questions/70420948/most-insanely-fastest-way-to-convert-9-char-digits-into-an-int-or-unsigned-int or 如何将二进制整数转换为十六进制字符串? https://stackoverflow.com/questions/53823756/how-to-convert-a-binary-integer-number-to-a-hex-string/66518284#66518284

还使用术语“矢量化”描述更高级别的软件转换,您可以完全抽象出循环,只描述对数组的操作,而不是对组成数组的元素的操作。例如写作C = A + B在某些语言中,当这些是数组或矩阵时,允许这样做,这与 C 或 C++ 不同。在这样的低级语言中,您可以描述调用 BLAS 或 Eigen 库函数,而不是作为矢量化编程风格手动编写循环。关于这个问题的其他一些答案集中在矢量化和高级语言的含义上。

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

什么是“矢量化”? 的相关文章

  • 使用 OpenCV 将光栅图像转换为矢量图形?

    我正在寻找使用 OpenCV 将光栅图像转换为矢量数据的可能性 在那里我发现了一个函数cv findContours 这似乎有点原始 更可能是我没有完全理解它 它似乎仅使用黑白图像 没有灰度和彩色图像 并且似乎不接受任何可能有助于噪声图像的
  • 与SSE性能相同

    我对以下循环进行了矢量化 该循环出现在我正在开发的应用程序中 void vecScl Node A Node B long val int fact round dot const for i 0 i
  • MATLAB 中不使用 for 循环的多个数组的交集

    我总是被告知 在 MATLAB 中几乎所有的 for 循环都可以省略 而且它们通常会减慢进程 那么这里有办法做到这一点吗 我有一个元胞数组 tsCell tsCell存储不同长度的时间数组 我想为所有时间数组找到一个相交的时间数组 Inte
  • 如何使用 SIMD 检查偶数/奇数通道是否在给定范围内?

    Given a m128i其中存储 16char是 偶数索引车道指的是even车道 即 0 2 4 14 处的车道 奇数索引车道指的是odd车道 即 1 3 5 15 处的车道 在我的应用程序中 偶数 奇数车道必须在给定范围内 例如 假设e
  • 朱莉娅中的矢量化“in”函数?

    我经常想要循环遍历数据帧的长数组或列 并且对于每个项目 查看它是否是另一个数组的成员 而不是做 giant list a c j good letters a b isin falses size giant list 1 for i 1
  • 在 R 中创建没有循环或递归的特定向量

    我有第一个向量 假设 x 仅由 1 和 1 组成 然后 我有第二个向量 y 它由 1 1 和 0 组成 现在 我想创建一个向量 z 其中包含索引 i a 1 ifx i 等于 1 并且 1 存在于 n 个先前元素之间的向量 y 内 y i
  • 进行水平 SSE 向量和(或其他简化)的最快方法

    给定一个由三个 或四个 浮点数组成的向量 对它们求和的最快方法是什么 SSE movaps shuffle add movd 总是比 x87 快吗 SSE3 中的水平相加指令值得吗 转移到 FPU 然后是 faddp faddp 的成本是多
  • 使用 x64 SIMD 进行半字节改组

    我知道字节改组 https www felixcloutier com x86 pshufb指令 但我想对半字节 4 位值 做同样的事情 具体来说 我想在 64 位字中混洗 16 个半字节 我的洗牌索引也存储为 16 个半字节 最有效的实施
  • Pandas 使用除 apply 之外的许多条件添加新列的替代方法

    我有两个数据框 比方说df and map dum 这里是df gt gt gt print df sales 0 5 1 10 2 9 3 7 4 1 5 1 6 1 7 2 8 9 9 8 10 1 11 3 12 10 13 2 14
  • AVX2浮点比较并得到0.0或1.0而不是全0或全1位

    基本上 在生成的向量中 我想为所有输入浮点值 gt 1 保存 1 0 而为所有输入浮点值 float f 8 1 2 0 5 1 7 1 9 0 34 22 9 18 6 0 7 float r 8 Must be 1 0 1 1 0 1
  • Numpy 方法从卷积核生成线性运算矩阵

    2D 卷积核 K 形状 k1 k2 n channel n filter 适用于 2D 矢量 A 形状 m1 m2 n channel 并生成另一个 2D 向量 B 形状 m1 k1 1 m2 k2 1 n filter with vali
  • 如何在 MATLAB 中编写向量化函数

    我刚刚学习MATLAB 我发现很难理解循环与矢量化函数的性能因素 在我之前的问题中 MATLAB 中的嵌套 for 循环非常慢 预分配 https stackoverflow com q 7811239 518169我意识到使用向量化函数与
  • 更有效的循环方式?

    我有来自一个更大脚本的一小段代码 我发现当函数t area被调用时 它负责大部分运行时间 我自己测试了这个函数 它并不慢 我相信它需要运行很多次 所以需要花费很多时间 这是调用该函数的代码 tri area np zeros numx nu
  • Python 中高效的逐元素函数计算

    我有以下优化问题 给定两个 np arraysX Y和一个函数K我想尽快计算矩阵关联 gram matrix 其中 i j th元素计算为K X i Y j 这里有一个使用嵌套 for 循环的实现 它被认为是解决此类问题最慢的 def pr
  • 如何矢量化 3D Numpy 数组

    我有一个 3D numpy 数组 例如a np zeros 100 100 20 我想对每个执行操作x y涉及所有元素的位置z轴 结果存储在一个数组中 例如b np zeros 100 100 在同一个对应的x y位置 现在我使用 for
  • 排列 SSE __m128i 寄存器内的字节

    我有以下问题 In m128i寄存器有 16 个 8bit 值 顺序如下 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 我想要实现的是有效地洗牌字节以获得此排序 1 2 3 4 5 6 7 8 9 10 11
  • 用子矩阵替换 numpy 矩阵元素

    鉴于我有一个索引方阵 例如 idxs np array 1 1 0 1 以及彼此大小相同的方阵数组 不一定与idxs mats array 0 0 0 0 5 1 0 3 1 1 我想替换每个索引idxs对应的矩阵为mats 得到 arra
  • 如何调试 numpy 掩码

    这个问题与this one https stackoverflow com q 73672739 11004423 我有一个正在尝试矢量化的函数 这是原来的函数 def aspect good angle float planet1 goo
  • 大数组上的 SSE 性能较慢

    我是 SSE 编程新手 所以我希望有人可以帮助我 我最近使用 GCC SSE 内在函数实现了一个函数来计算 32 位整数数组的总和 下面给出了我的实现代码 int ssum const int d unsigned int len stat
  • Numpy vectorize() 正在展平整个数组

    我的输入是一个 numpy 元组数组 values np array 4 5 2 18 4 7 3 8 我的功能如下 def outerFunc values print values def innerFunc values print

随机推荐

  • 重写 __cmp__ python 函数

    嗨 我是压倒一切的 cmp 如果传递的第二个对象是None 或者如果它不是一个实例someClass 然后返回 1 我不明白这里到底发生了什么 class someClass def cmp self obj if obj None ret
  • 编译器可以报告未知属性的错误吗?即使有范围?

    在N3291 7 6 1 3 5 属性语法和语义 decl attr grammar 关于如何属性是用我读过的源代码写的 使用一个属性范围令牌是有条件支持的 实现定义的行为 and For an 属性标记本国际标准中未指定 该行为是实现定义
  • TCPDF - 来自 mysql 的打印表显示重复的第一行

    我是 TCPDF 的新手 我面临的小问题是所有输出数据都显示同一行 我的意思是第一条记录重复数据库中存在的总数据 行 的次数 这是我的代码 tbl header
  • 从 Xcode 更改按钮文本?

    我有一个 IBAction 连接到 Interface Builder 中的一个按钮 是否可以在运行时从我的代码中更改按钮 在 IB 中 上的文本 如果您的代码中有一个连接到某个操作的按钮 则无需实例变量即可更改标题 例如 如果按钮设置为以
  • 在不同进程之间共享列表?

    我有以下问题 我编写了一个函数 它将列表作为输入 并为列表中的每个元素创建一个字典 然后我想将这本字典附加到一个新列表中 这样我就得到了一个字典列表 我正在尝试为此生成多个进程 我的问题是 我希望不同的进程访问由其他进程更新的字典列表 例如
  • 更改 Xamarin 中 ListView 所选项目的背景颜色

    我在 Xamarin 中创建了一个主从类型项目 当我从主页中选择一个项目时 背景颜色默认为橙色 我怎样才能将其更改为我选择的颜色 此问题是 Android 特有的 在 Android 项目中将此行添加到 Resources values s
  • MVVM ViewModel 与 MVC ViewModel

    ViewModel 是一个在 MVVM Model View ViewModel 和 ASP NET MVC 的推荐实现中使用的术语 鉴于每种模式都使用相同的术语 研究 ViewModel 可能会令人困惑 MVC ViewModel 和 M
  • 如何在 WINAPI 中获取 Windows 10 内部版本、修订号?

    我想使用 WINAPI 在 Windows 10 上获取构建版本 当前窗口版本 10 0 19042 685 我尝试使用 WMI 查询来获取它 select Version BuildNumber from Win32 OperatingS
  • 为什么 Dictionary 上的这个 Linq 查询不作为数据源工作

    我在VB中有以下内容 Dim sources From source In importSources Select New With Type source Key Source source Value Name dgridSource
  • 使用 Spring Boot 的 Flyway Core 给出错误 'delayedFlywayInitializer' 和 'entityManagerFactory' 之间的循环依赖关系

    我想在 SQL Server 数据库上导入一些数据 我使用的是 Spring Boot 2 3 4 我还使用 Hibernate 来生成表 我在pom中添加了flyway核心
  • 如何截取访客的页面屏幕截图?

    如何截取访客的页面屏幕截图 就像 Gmail 错误填充程序一样 https i stack imgur com Bi2QT png https i stack imgur com Bi2QT png 我认为这是一种方法 http html2
  • Eclipse:缺少 Java 构建路径

    我正在尝试使用 Eclipse 来使用适用于 Android 的 Google SDK 教程 我能够让前两个项目正常工作 但是当运行第三个 R java 时消失了 所以我放弃了 我根据练习 3 的解决方案集制作了一个全新的包 它充满了错误
  • 使用 lodash 方法 flatten 和 find 在 json 对象中查找值

    使用 lodash 我想找到一个 id 为 3229 的团队 我尝试关注但它没有返回任何内容 var team chain data teams flatten divisionTeams find id 3229 value 这是我的笨蛋
  • 使用 CSP 防止自动点击链接 XSS 攻击

    当将 CSP 用于稍微不同的目的 沙箱 时 我意识到一个非常简单的自动点击链接似乎甚至可以绕过相对严格的 CSP 我所描述的内容如下 内容安全政策 default src none script src unsafe inline 还有身体
  • 如何通过解析导入来组合并获取单个 Python 文件

    我正在尝试获取单个 Python 文件作为输出 我有一个 Python 脚本 其中有多个此类导入 from that import sub 导入来自所有本地模块 而不是来自系统或 Python 库 有什么方法可以解决这些问题并获得一个完整的
  • RubyMine 不能使用 Guard 吗?

    由于某些无法解释的原因 RubyMine 会自动保存您所做的每一个更改 因此每次击键都会触发 Guard 运行您的测试 最可笑的是 显然没有办法禁用这个自动保存 功能 我只是想知道 RubyMine 似乎是 Rails 开发人员中非常流行的
  • 响应.WriteFile

    有一个具有特定语法的 URL 用于下载文件 用户在文本框中输入文件名并按下下载按钮 在单击事件中 将调用 Response WriteFile 将文件发送到客户端 现在我想创建另一个带有页面的网站 用户在其中输入文件名并按下载按钮来下载该文
  • 使用 Git 的 Spring Cloud 配置服务器 - 无法克隆或签出存储库连接超时

    我正在使用 GIT 在 Spring Cloud Config Server 上进行 POC Spring Boot 1 5 3 RELEASE 爪哇1 8 弹簧工具套件https github com kishornpatil https
  • 使用 Visual Studio Tools for Docker 部署和调试远程 Linux Docker 容器

    我试图弄清楚如何使用部署到远程容器适用于 Docker 的 Visual Studio 工具 并调试我的 ASP NET Core 应用程序 实际上 我正在以下场景中工作 我的开发机器是 Hyper V 虚拟机 Docker is inst
  • 什么是“矢量化”?

    现在好几次了 我在 matlab fortran 其他一些 中遇到这个术语 但我从来没有找到解释它是什么意思 它有什么作用 所以我在这里问 什么是矢量化 例如 循环矢量化 是什么意思 许多CPU具有 向量 或 SIMD 指令集 它们同时对两