你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

量子中间表示形式

Quantum Intermediate Representation (QIR) 是一种中间表示形式,用作量子编程语言/框架与 targeted 量子计算平台之间的通用接口。 QIR 指定一组规则,用于在 LLVM IR 中使用与语言和硬件无关的格式来表示量子程序。 QIR 是由 QIR 联盟开发的一个项目,Microsoft 是其成员之一。

什么是中间表示?

经典编译器中的一个常见模式是首先将源语言编译为中间表示。 顾名思义,中间表示是指令从源代码转换为计算机语言的中间步骤。

中间表示充当程序的抽象表示形式。 所有程序,无论它们是用什么语言编写的,都由所谓的前端编译器转换为这种中间表示,而后端组件负责将该中间表示转换为计算机表示。 因此,中间表示允许将源语言与硬件平台分离,并可以以模块化方式构建编译器,其中每种新语言只需要在后端可用的所有平台上支持一个新前端。

中间表示通常被设计为允许表示许多不同的源语言。 此外,在这个中间级别,还可以执行一些优化和线路重新排列,使最终实现更加高效。 知道最终 target 执行平台后,中间表示形式可以编译为实际的可执行代码。

此方法允许许多源语言共享一组通用的优化器和可执行生成器。 它还使为许多不同的 targets编译单个源语言变得容易。 中间表示形式提供了一个可在多个源之间共享的 targets 通用平台,并允许在编译器机制中大量重复使用。

什么是 Quantum Intermediate Representation?

QIR 是 Microsoft 所属的 QIR 联盟开发的量子程序的一个中间表示形式。 它提供了一个通用接口,支持许多用于量子计算的语言和 target 平台。 可以将 QIR 视为一种通用的中层语言,用于实现高级语言和计算机之间的通信。 虽然 Q# 编译为 QIR,但 QIR 并不特定于 Q#:任何量子编程框架都可以利用 QIR 来表示量子程序。 它与硬件无关,这意味着它不指定量子指令或门集,将其留给 target 计算环境。

QIR 基于常用的开源 LLVM 经典编译器。 LLVM 是一组模块化和可重用的编译器和工具链技术,已被多种语言所采用。 QIR 指定一组用于表示 LLVM 中的量子构造的规则,但它不需要对 LLVM 进行任何扩展或修改。

LLVM 是基础工具链这一事实意味着 QIR 自然能够处理经典逻辑和量子逻辑。 这一特性对于混合量子经典算法至关重要,而该算法对于量子计算的应用也越来越重要。 此外,它还允许利用来自经典计算行业的编译和优化工具,从而降低编写翻译的成本。

许多领先的量子计算行业已经采用了 QIR。 例如,NVIDIA、橡树岭国家实验室、Quantinuum、Quantum Circuits Inc. 和 Rigetti Computing 正在构建利用 QIR 的工具链。

有关详细信息,请参阅 QIR 规范。 如果对使用 QIR 的编译器工具和项目感兴趣,请查看这些 QIR 存储库

什么是 QIR 联盟?

QIR 联盟是一项共同努力,开发具有前瞻性的量子中间表示形式,目的是在量子生态系统中实现完全互操作性,减少各方的开发工作量,并提供适用于当前和未来异质量子处理器的表示形式。

量子 SDK 和语言的出现和发展速度很快,同时出现的还有新的量子处理器,它们具有各自独特的功能。 为了在新语言和新硬件功能之间提供互操作性,生态系统必须开发和共享适用于当前和未来量子硬件的中间表示形式。

QIR 联盟通过其集体工作和伙伴关系,旨在:

  • 通过促进不同框架和语言之间的互操作性,减少各方所需的开发工作。
  • 支持开发用于量子应用程序开发和量子编译器开发的共享库。
  • 以最先进的编译器技术为基础,并利用现有的工具、库和从高性能计算中学到的知识。
  • 允许经典和量子计算在硬件级别交互方式的增量和渐进式演进。
  • 提供灵活性,以一种允许使用不同、差异化的硬件功能进行试验的方式轻松连接新兴技术。

QIR 联盟是 Linux 基金会联合开发基金会在开放标准方面工作的一部分。 创始成员包括微软,以及 Quantinuum (前霍尼韦尔) 、橡树岭国家实验室、量子电路公司和 Rigetti Computing。

看起来 Quantum Intermediate Representation 是什么样子?

由于 QIR 基于 LLVM,QIR 看起来像 LLVM。

例如,考虑以下 Q# 代码来生成 Bell 对:

operation CreateBellPair(q1 : Qubit, q2 : Qubit) : Unit {
    H(q1);
    CNOT(q1, q2);
}

当编译为 QIR 时,它会变成:

define void @CreateBellPair__body(%Qubit* %q1, %Qubit* %q2) {
entry:
  call void @__quantum__qis__h(%Qubit* %q1)
  call void @__quantum__qis__cnot(%Qubit* %q1, %Qubit* %q2)
  ret void
}

在此代码片段中,可以看到几个 QIR 功能:

  • Q#(或任何其他量子编程语言)中的操作由 LLVM 函数表示。
  • 量子比特表示为指向名为 的 %Qubit命名不透明结构类型的指针。

虽然 CreateBellPair 操作的 QIR 非常简单,但 QIR 继承了 LLVM 表达循环、条件和其他复杂控制流的所有功能。 QIR 还继承了 LLVM 表达任意经典计算的能力。

有关详细信息,请观看 2021 Q2B 活动中的 Microsoft 开发者会话。

为什么很重要 Quantum Intermediate Representation ?

在真实硬件上运行量子算法时,QIR 是必不可少的工具。 但即使你只想在更理论层面开发算法,中间表示也能起到重要作用。

例如,QIR 启用的一个应用程序是使用 Clang 编译器(LLVM 的 C 语言前端)将 QIR 编译为经典 target的可执行计算机代码。 这为通过实现量子指令在 C 或 C++ 中生成模拟器提供了一条简单的路径,该路径可以简化量子模拟器的创建。

此外,可以使用中间表示生成稍后作为输入提供给量子模拟器(而不是实际设备)的代码,它可能使用不同于源代码的语言。 这样,便可以使用通用框架轻松比较和基准测试不同的语言或模拟器。

在代码优化方面,有一些优化步骤可以在中间级别执行,可以使整体算法实现更高效。 调查输入代码的这种优化有助于更好地了解如何使算法更高效以及如何改进量子编程语言。

另一个应用程序是使用标准 LLVM“传递”基础结构来创建在 QIR 上运行的量子代码优化器。 独立于语言和硬件的 QIR 方法使得可以在不同的计算语言和计算平台上重用这些优化器,而几乎不需要付出任何努力。

后续步骤