REP 指令是否被视为向量运算?
Are REP instructions considered vector operations?
我想了解 SIMD 和矢量指令的概念。
如果我理解正确的话:
- 向量指令是对一维数据数组(=向量)进行操作的指令,与对单个数据项进行操作的标量指令相反。
- SIMD 指令实际上是单指令多数据指令,看起来与向量指令一样...我真的不知道有什么区别,如果有的话..
REP 指令对数据数组进行操作,因此看起来它们实际上是 SIMD/vector 指令。我还没有看到任何文章将它们描述为矢量指令,而且我知道 REP 指令不是 x86 的 SIMD 扩展的一部分。
我的问题是:
- REP 是否被视为向量运算?
- REP 是否被视为 SIMD 指令?
- 向量和 SIMD 指令之间有什么实际区别吗?
快速 google 搜索我的第三个问题让我得到了这个:
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 术语可以互换使用,所以我认为没有实际区别...
"Vector" 和 "SIMD" 的意思大致相同,但在通常的用法中,这两个术语通常指向不同的实现方法。这种区别源于计算术语的历史。 "vector" 和 "SIMD" 指令集都基于在 序列中 没有数据依赖性的情况下对多个数据元素执行相同操作的概念操作。当没有数据依赖性时,操作可以按任何顺序执行,包括同时执行。
从历史上看,"vector" 是较旧的术语,"vector" 指令被认为是单个指令,通过单个功能单元将操作流水线化,对一系列元素执行某些操作。 "single functional unit" 与作为概念的矢量化无关——这是在晶体管非常昂贵(1960 年代中期到 1990 年代中期)时实现矢量机的方式。最近的 "vector" 架构使用单个向量指令来跨多个功能单元进行流水线操作。例如,NEC SX-Aurora TSUBASA 处理器有 256 个元素向量寄存器和 32 个向量功能单元,每个 256 元素向量向每个向量功能单元发送 8 个元素。
我不知道 "SIMD" 这个词是什么时候第一次使用的,但我不记得在 20 世纪 90 年代中期之前看到过它的普遍使用,当时 "SIMD" 指令最初被开发为一种在 现有 寄存器宽度内对较小数据大小执行多个并行操作的方法。例如,英特尔 MMX 指令集 (1997) 使处理器能够对 64 位寄存器的内容执行独立的 8/16/32 位操作。后来的 SIMD 指令集(SSE 等)提供了比任何单一支持的数据类型都宽的新寄存器,以允许在寄存器内对高达 64 位宽的独立字段进行操作。指令集的设计支持跨整个SIMD寄存器宽度的操作同时进行,但这不是必须的。例如,AMD 已经生产了几代处理器,这些处理器支持比功能单元的并行性更广泛的 SIMD 寄存器指令。例如,AMD 的第一代 EPYC 处理器支持 256 位 SIMD 指令,但这些指令会在两个连续的周期内分派到 128 位宽的功能单元。 ARM 的可扩展向量扩展进一步分离了向量宽度和并行功能单元数量的概念。
x86 体系结构中的 "REP" 指令提供了有限的能力来为 "string instructions" 和 "in/out" 指令提供类似向量的功能。它们不是通用机制,我相信许多 Intel 处理器设计人员希望它们可以从指令集中删除。一些有趣的历史记录在 https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/275765
的论坛讨论中
我想了解 SIMD 和矢量指令的概念。 如果我理解正确的话:
- 向量指令是对一维数据数组(=向量)进行操作的指令,与对单个数据项进行操作的标量指令相反。
- SIMD 指令实际上是单指令多数据指令,看起来与向量指令一样...我真的不知道有什么区别,如果有的话..
REP 指令对数据数组进行操作,因此看起来它们实际上是 SIMD/vector 指令。我还没有看到任何文章将它们描述为矢量指令,而且我知道 REP 指令不是 x86 的 SIMD 扩展的一部分。
我的问题是:
- REP 是否被视为向量运算?
- REP 是否被视为 SIMD 指令?
- 向量和 SIMD 指令之间有什么实际区别吗?
快速 google 搜索我的第三个问题让我得到了这个:
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 术语可以互换使用,所以我认为没有实际区别...
"Vector" 和 "SIMD" 的意思大致相同,但在通常的用法中,这两个术语通常指向不同的实现方法。这种区别源于计算术语的历史。 "vector" 和 "SIMD" 指令集都基于在 序列中 没有数据依赖性的情况下对多个数据元素执行相同操作的概念操作。当没有数据依赖性时,操作可以按任何顺序执行,包括同时执行。
从历史上看,"vector" 是较旧的术语,"vector" 指令被认为是单个指令,通过单个功能单元将操作流水线化,对一系列元素执行某些操作。 "single functional unit" 与作为概念的矢量化无关——这是在晶体管非常昂贵(1960 年代中期到 1990 年代中期)时实现矢量机的方式。最近的 "vector" 架构使用单个向量指令来跨多个功能单元进行流水线操作。例如,NEC SX-Aurora TSUBASA 处理器有 256 个元素向量寄存器和 32 个向量功能单元,每个 256 元素向量向每个向量功能单元发送 8 个元素。
我不知道 "SIMD" 这个词是什么时候第一次使用的,但我不记得在 20 世纪 90 年代中期之前看到过它的普遍使用,当时 "SIMD" 指令最初被开发为一种在 现有 寄存器宽度内对较小数据大小执行多个并行操作的方法。例如,英特尔 MMX 指令集 (1997) 使处理器能够对 64 位寄存器的内容执行独立的 8/16/32 位操作。后来的 SIMD 指令集(SSE 等)提供了比任何单一支持的数据类型都宽的新寄存器,以允许在寄存器内对高达 64 位宽的独立字段进行操作。指令集的设计支持跨整个SIMD寄存器宽度的操作同时进行,但这不是必须的。例如,AMD 已经生产了几代处理器,这些处理器支持比功能单元的并行性更广泛的 SIMD 寄存器指令。例如,AMD 的第一代 EPYC 处理器支持 256 位 SIMD 指令,但这些指令会在两个连续的周期内分派到 128 位宽的功能单元。 ARM 的可扩展向量扩展进一步分离了向量宽度和并行功能单元数量的概念。
x86 体系结构中的 "REP" 指令提供了有限的能力来为 "string instructions" 和 "in/out" 指令提供类似向量的功能。它们不是通用机制,我相信许多 Intel 处理器设计人员希望它们可以从指令集中删除。一些有趣的历史记录在 https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/275765
的论坛讨论中