我知道什么是矢量化,也知道什么是流水线。我假设“向量流水线”可能意味着以可以流水线化向量指令的方式进行向量化。这是现代建筑中具有更具体含义的新功能还是即将到来的功能?
3月5日更新
我认为这个答案很好。我确实不清楚我是在寻找“新事物”还是过去的矢量流水线(对不起,布莱恩!)。我在未来硬件技术的背景下遇到了这个短语,想知道我是否遗漏了什么。感谢大家的见解/贡献。以后我会更加小心我的问题。
我知道什么是矢量化,也知道什么是流水线。我假设“向量流水线”可能意味着以可以流水线化向量指令的方式进行向量化。这是现代建筑中具有更具体含义的新功能还是即将到来的功能?
3月5日更新
我认为这个答案很好。我确实不清楚我是在寻找“新事物”还是过去的矢量流水线(对不起,布莱恩!)。我在未来硬件技术的背景下遇到了这个短语,想知道我是否遗漏了什么。感谢大家的见解/贡献。以后我会更加小心我的问题。
术语“向量流水线”在 1970 年代用于描述向量处理,当时单个向量指令可能(例如)使用单个流水线浮点算术单元计算两个浮点数向量的总和。成对的浮点数将从内存中带入流水线运算单元以相加,一旦流水线填满,您将在每个周期得到一个总和,这些总和将流回内存。请参阅 Ramamoorthy 和 Li 1977 年的这篇文章:
http://web.ece.ucdavis.edu/~vojin/CLASSES/EEC272/S2005/Papers/Ramamoorthy_mar77.pdf
STAR、ASC 和 CRAY-1 等早期超级计算机就是以这种方式实现矢量处理的。可以通过添加“向量寄存器”来存储向量的固定长度部分(比如 64 个元素长)来修改基本方法。多个流水线 ALU 也可用于同时对它们自己的向量执行相同或不同的操作。Cray-1 可以将向量运算“链接”在一起,以便将一个向量运算的输出馈送到另一个运算。
这与 Intel 和 AMD 的现代 x86 处理器上的 SSE 和 AVX 指令有些不同。这些处理器包括“单指令多数据”指令。处理器有多个并行浮点算术单元,可以(例如)从两个向量寄存器中获取四对浮点数,在一个周期内将它们相加,然后将结果存储在另一个向量寄存器中。
尽管现代的实现与 1970 年代和 80 年代的实现方式大不相同,但从编程的角度来看,用向量加法等操作来表达算法的想法是相似的。
我的年龄还不足以理解这一点,但我的理解是,过去的向量流水线允许管道中的一个向量指令使用它前面的向量指令的结果。我相信现在在最常见的向量架构上这是不可能的。向量指令是流水线的,但仅限于它们是独立的。
指令级并行 (ILP) 是向量化的补充,但两者都需要足够的缓存和寄存器空间。 我们的论文(很高兴得知您自己的论文回答了您的问题,是吗?)详细分析了 Blue Gene/P 上的模板操作,结合矢量化和展开/堵塞以在有效使用寄存器的同时公开足够的并行性。
现代硬件具有几个周期的浮点指令延迟(GPU 更多)。对于峰值触发器,您需要能够在每个周期发出 FP 指令。这可以使用 ILP 或使用多个硬件线程来完成。硬件线程通常允许您访问更多寄存器,但必须共享缓存,并且跨线程通信比单个线程中的数据依赖关系相对更昂贵。因此,硬件线程比 ILP 好还是差取决于应用程序和硬件。
悉尼大学 1990 年的这篇晦涩难懂的技术评论将“向量流水线”称为在底层实现 SIMD 的一种手段——如果您认为处理器没有足够的逻辑来一次执行“全宽”向量指令去,但是可以将指令分解为子操作(在指令集级别以下的级别),那么通过流水线化这些子操作可以获得性能增益,因此处理n倍的数据所需的时间少于n倍的时间。
为了稍微说明一下,假设 8x8=8 位操作“swizzle”需要 4 个时钟,并且可以方便地分解为四个 1 时钟阶段。我们的芯片还有八个独立的调酒单元。
我们可以在 4 个时钟内调换一对值。
使用 SIMD,我们可以通过一次使用所有调配单元来调配多达 8 对值(64x64=64 位)。
如果没有流水线,一条 16 宽 (128x128=128) 的 swizzle 指令将需要 8 个时钟,而一条 32 宽 (256x256=256) 的 swizzle 指令将需要 16 个时钟。
使用矢量矢量流水线,芯片可以在时钟 1 上将前 8 个操作数引入到 swizzle 流水线的第一阶段(在时钟 4 上出现),第二组在时钟 2 上(在时钟 5 上出现)等。假设为零分解和重新组装操作数的开销,假设我已经理解这一点,那么你可以在 5 个时钟内有一个 16 宽的 swizzle,在 7 个时钟内有一个 32 宽的 swizzle。
现代建筑是否有(或需要)这样的东西,恐怕我不知道。