assembly - REP 指令是否被视为向量运算?

标签 assembly x86 simd

我正在尝试理解 SIMD 和向量指令的概念。 如果我理解正确的话:

  • 向量指令是对一维数据数组(=向量)进行操作的指令,而不是对单个数据项进行操作的标量指令。
  • SIMD指令实际上是单指令多数据指令,看起来和向量指令是一样的……我真的不知道有什么区别,也不知道是否有区别……

REP 指令对数据数组进行操作,因此看起来它们实际上是 SIMD/向量指令。我还没有看到任何文章将它们描述为向量指令,而且我知道 REP 指令不是 x86 SIMD 扩展的一部分。

我的问题是:

  1. REP 是否被视为向量运算?
  2. REP 是否被视为 SIMD 指令?
  3. 矢量指令和 SIMD 指令之间有什么实际区别吗?

通过谷歌快速搜索我的第三个问题,我得到了这个:

Vector-processing architectures are now considered separate from SIMD computers, based on the fact that vector computers processed the vectors one word at a time through pipelined processors (though still based on a single instruction), whereas modern SIMD computers process all elements of the vector simultaneously.

在我读过的实际文章中,我没有看到提到的差异,并且向量和 SIMD 术语可以互换使用,因此让我认为没有实际差异......

最佳答案

“矢量”和“SIMD”的含义大致相同,但在常见用法中,这些术语通常指向不同的实现方法。这种区别源于计算术语的历史。 “向量”和“SIMD”指令集都基于在操作序列内不存在数据依赖性的情况下对多个数据元素执行相同操作的概念。当不存在数据依赖性时,操作可以按任何顺序执行,包括同时执行。

从历史上看,“向量”是较旧的术语,“向量”指令被认为是通过单个功能单元对操作进行流水线操作来对元素序列执行某些操作的单个指令。 “单一功能单元”与矢量化这个概念无关——这是在晶体管非常昂贵时(20 世纪 60 年代中期到 90 年代中期)实现矢量机的方式。最近的“向量”架构使用单个向量指令来跨多个功能单元进行流水线操作。例如,NEC SX-Aurora TSUBASA处理器有256个向量寄存器和32个向量功能单元,每个256个向量向每个向量功能单元发送8个元素。

我不知道“SIMD”一词何时首次使用,但我不记得在 20 世纪 90 年代中期之前看到过它的普遍使用,当时“SIMD”指令首次开发为执行多个并行的方法在现有寄存器宽度内对较小数据大小进行操作。例如,Intel MMX指令集(1997)使处理器能够对64位寄存器的内容执行独立的8/16/32位操作。后来的 SIMD 指令集(SSE 等)提供了比任何单一支持的数据类型更宽的新寄存器,以允许在寄存器内高达 64 位宽的独立字段上进行操作。指令集的设计支持跨整个SIMD寄存器宽度的操作的同时操作,但这不是必需的。例如,AMD 已经生产了几代处理器,支持比功能单元并行性更宽的 SIMD 寄存器上的指令。例如,AMD 的第一代 EPYC 处理器支持 256 位 SIMD 指令,但这些指令在两个连续周期内调度到 128 位宽的功能单元。 ARM 的可扩展向量扩展进一步解耦了向量宽度和并行功能单元数量的概念。

x86 架构中的“REP”指令为“字符串指令”和“输入/输出”指令提供类似向量的功能的能力有限。它们不是通用机制,我确信许多英特尔处理器设计者希望它们能够从指令集中删除。论坛讨论中有一些有趣的历史记录:https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/275765

关于assembly - REP 指令是否被视为向量运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59775017/

相关文章:

openmp - OpenMP 4.0 中 "simd"构造和 "for simd"构造的区别

c - SSE操作可在2D数组上实现循环,其中每个输出取决于包含该数组的3x3正方形(生命游戏)

assembly - 因此,在x86-64上它的字节序大吗?

x86 - CPU特权环: Why rings 1 and 2 aren't used?

assembly - 我可以从 EAX/RAX 获取 int 到 FPU 的寄存器(如 st0)吗?

ios - 在 NEON float32x4_t 中总结 3 条车道

assembly - while 搜索字符串的每个字符并在 emu8086 中更改它如何结束无限循环?

c - Linux asm ("int $0x0") 与除以零

linux - 汇编程序在 GDB 中找不到调试符号

x86 - CPU如何处理异步中断?