【问题标题】:Where did code morphing go? [closed]代码变形去了哪里? [关闭]
【发布时间】:2010-11-06 20:48:02
【问题描述】:

Linus Torvalds 曾在一家名为 Transmeta 的处理器公司工作。他们制造的处理器是核心中基于 RISC 的对象。如果我没记错的话,这个想法是核心运行一个任意且可升级的“处理器仿真层”(可能是 x86、powerpc 等),它将高级操作码转换为 RISC 核心指令集。

这个想法发生了什么,您认为这种方法可能具有优势(在编程方面)的优点、缺点和情况是什么?

【问题讨论】:

  • +1 非常有趣的问题。我正在等待有人将 x86 Flash 播放器转换为 ARM。 :-)
  • 代码变形确实看到了 NVIDIA Denver 内核的复兴,该内核首先用于 HTC Google Nexus 9 平板电脑(其 Tegra K1 SoC 有两个 Denver核心)。在内部,它是 7 宽的有序 VLIW。 NVIDIA 将代码变形技术称为“动态代码优化”。它基本上在运行时为底层内核转换和优化 ARMv8-A 代码,并将结果缓存在专用的内存块中。在理想条件下(例如重复的、可预测的代码),它的性能几乎与桌面 Haswell 一样;在不太理想的条件下,它可能不会比 Cortex-A53 快多少。
  • 我拥有一台 Nexus 9 并且非常广泛地使用它;在大多数轻量级的单线程任务中,它的性能相当不错,但是当被要求同时做很多事情时,它的性能很差。只有两个内核并且不喜欢不可预测的代码(优化版本尚未缓存,需要先编译或不完全适合 128 MB 缓存)会明显损害复杂的工作负载性能。处理器内部有一个 ARM 解码器,作为尚未翻译和优化但非常非常慢的代码的后备。高时钟速度(2.3 GHz)在一定程度上弥补了这一点。

标签: processor


【解决方案1】:

明显的优点:

  • 能够运行任何操作系统(只需将处理器仿真切换到需要的状态)
  • 无需软件支持即可在同一处理器/操作系统上为不同架构运行二进制文件的可能性(当然需要内核支持)。

明显的缺点:

  • 额外的仿真层 == 更多开销 == 需要更快的处理器才能获得同等的性能。

【讨论】:

    【解决方案2】:

    一方面,大多数 CISC 处理器在内部将其操作码转换为类似于 RISC 操作的 uops 微操作。流水线和多核已经缩小了 RISC 处理器上的差距,以至于它们之间的差异非常小,如果有的话。如果您需要 C 源代码或其他程序集前端的交叉兼容性,您可以使用 LLVM。 http://llvm.org/

    【讨论】:

      【解决方案3】:

      该公司的表现不如预期,最终被 Novafora 收购,因为它的节能技术。 (http://www.novafora.com/pr01-28-09.html)

      据我所知,该技术根本无法与现有系统竞争。他们远远低于他们的业绩数字。此外,虽然可以在他们的 VLIW 设计之上放置另一个翻译器,但我不知道他们生产的任何产品都这样做了。我不记得 Crusoe 芯片能够接受替代的“翻译”微码下载。

      我个人拥有一台使用 Crusoe 处理器的设备,虽然它确实可以延长电池寿命,但该设备的性能却令人沮丧。部分责任可能归咎于它使用的特殊版本的 Windows,但它仍然很慢。

      充其量,它适用于便携式远程桌面。

      恕我直言,该技术与 .Net 和 JVM 等软件虚拟机具有相同的优势:

      • 好处是您可能可以 加快代码速度 硬件解决方案(就像 IBM 所做的那样) 它是 Java 加速器处理器) 比纯软件JIT。
      • 缺点是你永远不会得到原始的 处理器执行的性能 本机代码获取。

      从某些角度来看,您可以将现代 x86 芯片视为代码变形,尽管是非常专业的芯片。他们将 x86 架构转换为更高效的类似 RISC 的子指令集,然后执行这些子指令。

      这种技术的另一个例子是 FPGA,它可以被编程以在电路级别上模拟各种处理器或原始电路。我相信某些 Cray 系统可以配备这种“加速器节点”。

      【讨论】:

        【解决方案4】:

        大多数现代处理器实际上使用microcode 来实现它们的指令集。 造成这种情况的原因有很多,包括兼容性问题,但也有其他原因 原因。

        实际上很难区分什么是“硬件”和什么是“软件”。 现代虚拟机,如 JVM 或 CIL (.NET) 也可以在硬件中实现,但无论如何这可能只是使用微码来完成。

        在系统中具有多个抽象层的原因之一是 程序员/工程师在工作时不必考虑无关的细节 更高的层次。

        操作系统和系统库还提供了额外的抽象层。但是,如果不需要它们提供的功能(即操作系统完成的线程调度),拥有这些层只会使系统“变慢”。让您自己的特定程序调度程序击败 Linux 内核中的调度程序并非易事。

        【讨论】:

          【解决方案5】:

          我会说成本降低伴随着数量,因此像 Transmeta 芯片这样的产品必须大量销售才能与现有的大批量 x86 芯片在价格上竞争。

          如果我记得,Transmeta 芯片的关键在于它是低功耗的。每个时钟周期来回翻转的硅门更少,可以节省能源。代码变形是为了让您可以在低功耗 RISC 芯片上运行复杂指令集 (CISC)。

          Transmeta 的第一款处理器 Crusoe 由于甚至运行基准测试软件的问题而表现不佳。他们的第二款处理器 Efficeon 确实比 Intel Atom 使用了更少的功率(在相同的性能类别中),并且在相同的功率范围内比 Centrino 表现更好。

          现在,像您一样从软件和灵活性的角度来看,代码变形只是即时编译的一种形式,具有该技术的所有优点和缺点。您的 x86 代码本质上是在虚拟机上运行并由另一个处理器模拟。目前虚拟化的最大好处是能够在多个虚拟机之间共享一个处理器,从而减少空闲 CPU 周期,从而提高效率(硬件成本和能源成本)。

          所以在我看来,代码变形就像任何形式的虚拟化一样,都是为了更有效地利用资源。

          【讨论】:

            【解决方案6】:

            有关硬件辅助 x86 ISA 虚拟化的另一种方法,您可能想了解Loongson 3 CPU。

            【讨论】: