ALU 如何在 AMD GPU (VLIW) 中执行指令?

Posted

技术标签:

【中文标题】ALU 如何在 AMD GPU (VLIW) 中执行指令?【英文标题】:How ALU execute instruction in AMD GPU (VLIW)? 【发布时间】:2013-12-27 02:10:17 【问题描述】:

我想问一些关于 OpenCL 编程的问题。 我知道四分之一的波前可以为每个周期时钟发出指令,并且需要四个周期时钟来调用波前。 要完成 VLIW 架构中的指令,需要 8 个周期的时钟。 因此,调用另一个波前是一种解决方案。如果我调用两个波前然后 这将是八个周期时钟。因此,在波前 A 被执行(4 个周期时钟)之后,波前 B 被执行(另一个 4 个周期时钟)。 波前 B 执行完毕后(总周期时钟为 8),波前 A 将用另一条指令再次执行。

问题是:

如果每个处理单元的四个 ALU 已经用于执行另一条指令,ALU 如何执行另一条指令?

例如: 在周期 1 中,工作项 0-15 开始执行指令“ADD”。 每个处理单元中的第一个 ALU(SIMD/计算单元中总共 16 个 PE)计算“ADD”指令。 它发生在波前的第 2、3 和 4 周期(现在每个 PE 中有 4 个 ALU 忙于执行“ADD”指令) 在周期 5 中,四分之一的波前 2 开始执行指令“SUBTRACT”。 处理元素中的 ALU 如何计算指令,因为它们忙于计算 来自第一个波前的“ADD”指令(请记住,在第一个周期中执行四分之一波前的指令“ADD”是未完成的,因为它需要 8 个周期时钟)??

更新: 8个周期时钟意味着写后读的延迟

【问题讨论】:

en.wikipedia.org/wiki/CPU_pipeline 对不起,8个周期时钟是指写后读的延迟。我已经阅读了***并理解了这个概念,但是如果一条指令需要八个周期,如果每个处理元件中的所有 ALU 仍然执行来自第一个波前(周期 0-4)的指令,那么 ALU 如何执行来自第二个波前(周期 5-8)的指令8个周期时钟完成?? 【参考方案1】:

正如您所说,处理一个波前需要 4 个时钟周期。该指令的结果被发送到寄存器,但由于写入后读取延迟,这些结果将仅在 8 个时钟周期后可用。这里的重要区别是 ALU 在 4 个周期内完成了它们的工作,因此它们可以继续处理其他指令。寄存器内存需要 8 个周期来完成其工作,即存储新数据并使其再次可见。

作为所有类型的内存访问(包括寄存器)的一般说明:内存访问的处理方式与普通算术不同,ALU 可以在等待内存访问时继续执行不依赖于内存访问结果的指令完成。

【讨论】:

什么样的寄存器需要四个时钟周期才能将输入传播到输出? 显然,AMD。这是我对 AMD Accelerated Parallel Processing OpenCL Programming Guide 修订版 2.7(2013 年 11 月)第 7.6.1 节的解释。根据 CUDA 5.5 最佳实践指南的第 9.2.6 节,Nvidia 与此类似。 第 1 部分(共 2 部分):7.6.1 隐藏 ALU 和内存延迟 大多数算术运算(例如浮点加法)的读写延迟只有 8 个周期。对于大多数 AMD GPU,每个计算单元每个周期可以执行 16 条 VLIW 指令。每个波前由 64 个工作项组成;每个计算单元在每个周期执行四分之一波前,整个波前在四个连续周期中执行。因此,要隐藏八个延迟周期,程序必须安排两个波前。 第 2 部分,共 2 部分:计算单元连续四个周期执行第一个波前;然后它立即切换并执行另一个波前四个周期。八个周期过去了,来自第一个波前的 ALU 结果已准备好,因此计算单元可以切换回第一个波前并继续执行。运行两个波前(128 个线程)的计算单元完全隐藏了 ALU 管道延迟。 这两部分是 AMD OpenCL 编程指南第 7.6.1 节的第 1 段。

以上是关于ALU 如何在 AMD GPU (VLIW) 中执行指令?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AMD/ATI GPU 上运行 TensorFlow?

无论如何在带有 AMD GPU 的 Mac 中使用 Keras?

如何在 AMD GPU 上运行 Python?

如何将 AMD GPU 用于 fastai/pytorch?

GPU入门

Stable Diffusion半秒出图;VLIW的前世今生;YOLOv5全面解析教程 | AI系统前沿动态