EPIC上的Wikipedia文章已经概述了VLIW和EPIC的许多常见风险。
如果没有人从那篇文章中了解宿命论,让我强调一下:
来自包括CPU缓存和DRAM的内存层次结构的负载响应没有确定的延迟。
换句话说,任何无法解决(*)内存访问带来的不确定性延迟的硬件设计都将成为一个重大失败。
(*)通过“应付”,有必要获得相当好的执行性能(换句话说,“具有成本竞争力”),这有必要使CPU如此频繁地闲置数十至数百个周期。
请注意,EPIC所采用的应对策略(在上面链接的Wikipedia文章中提到)实际上并未解决问题。它只是说指示数据依赖性的负担现在落在了编译器上。没关系; 编译器已经具有该信息,因此编译器很容易遵守。问题在于,在访问内存时,CPU仍将闲置数十到数百个周期。换句话说,它外部化了次要责任,但仍然无法应付主要责任。
这个问题可以改写为:“鉴于注定要失败的硬件平台,为什么(1)没有(2)编译器编写者不能做出巨大的努力来赎回它?”
我希望我的改写将使该问题的答案显而易见。
失败的第二个方面也是致命的。
应对策略(在同一篇文章中提到)假定基于软件的预取可用于恢复由于内存访问的不确定延迟而导致的至少部分性能损失。
实际上,只有在执行流操作(以顺序或高度可预测的方式读取内存)时,预取才有收益。
(也就是说,如果您的代码频繁访问某些本地化的内存区域,则缓存会有所帮助。)
但是,大多数通用软件必须进行大量的随机内存访问。如果我们考虑以下步骤:
对于大多数通用软件,这三个必须快速连续执行。换句话说,并非总是可能(在软件逻辑的范围内)预先计算地址,或者找到足够的工作来填充这三个步骤之间的停顿。
为了帮助解释为什么总是找不到足够的工作来填补摊位的原因,这是人们如何可视化它的原因。
- 假设,要有效地隐藏停顿,我们需要填充100条不依赖于内存的指令(这样就不会遭受额外的延迟)。
- 现在,作为程序员,请将您选择的任何软件加载到反汇编程序中。选择一个随机函数进行分析。
- 您能否在任何地方识别100条指令(*)的序列,而这些指令完全没有内存访问?
(*)如果我们能够做NOP
一些有用的工作...
现代的CPU尝试使用动态信息来应对这些问题-通过同时跟踪每条指令在管道中循环时的进度。如上所述,该动态信息的一部分归因于不确定的内存延迟,因此编译器无法将其预测为任何准确性。通常,在编译时根本没有足够的信息来做出可能填补这些停顿的决策。
回应AProgrammer的回答
并不是说“编译器...提取并行性很困难”。
现代编译器对内存和算术指令的重新排序证明了它可以毫无问题地识别可独立执行的操作。
主要问题是不确定的存储器等待时间意味着,为VLIW / EPIC处理器编码的任何“指令配对”最终都将因存储器访问而停滞。
优化不会停顿的指令(仅用于寄存器,算术)将无法解决由极可能停顿(存储器访问)的指令所引起的性能问题。
这是无法应用80-20优化规则的一个例子:优化已经很快的事物不会有意义地提高整体性能,除非较慢的事物也得到了优化。
作为对Basile Starynkevitch的回答
这并不是说“……(无论如何)都很难”,这是因为EPIC不适合任何必须应对高动态延迟的平台。
例如,如果处理器具有以下所有功能:
- 没有直接的内存访问;
- 任何内存访问(读或写)都必须通过DMA传输进行调度;
- 每条指令具有相同的执行延迟;
- 有序执行;
- 宽/矢量化执行单元;
那么VLIW / EPIC将是一个很好的选择。
在哪里可以找到这样的处理器?DSP。这就是VLIW蓬勃发展的地方。
事后看来,Itanium的失败(尽管有明显的证据,但R&D努力仍不断地失败)是组织失败的一个例子,值得深入研究。
当然,供应商的其他业务,例如超线程,SIMD等,似乎都非常成功。对Itanium的投资可能会对其工程师的技能产生丰富的影响,这可能使他们能够创造下一代成功的技术。