培训
你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
量子中间表示形式
Quantum Intermediate Representation (QIR)是中间表示形式,充当量子编程语言/框架与目标量子计算平台之间的通用接口。 QIR 指定一组规则,用于在 LLVM IR 中使用与语言和硬件无关的格式来表示量子程序。 QIR 是由 QIR 联盟开发的一个项目,Microsoft 是其成员之一。
经典编译器中的一个常见模式是首先将源语言编译为中间表示。 顾名思义,中间表示是指令从源代码转换为计算机语言的中间步骤。
中间表示充当程序的抽象表示形式。 所有程序,无论它们是用什么语言编写的,都由所谓的前端编译器转换为这种中间表示,而后端组件负责将该中间表示转换为计算机表示。 因此,中间表示允许将源语言与硬件平台分离,并可以以模块化方式构建编译器,其中每种新语言只需要在后端可用的所有平台上支持一个新前端。
中间表示通常被设计为允许表示许多不同的源语言。 此外,在这个中间级别,还可以执行一些优化和线路重新排列,使最终实现更加高效。 知道最终 target 执行平台后,中间表示形式可以编译为实际的可执行代码。
此方法允许许多源语言共享一组通用的优化器和可执行生成器。 它还便于为许多不同的 targets源语言编译单个源语言。 中间表示形式提供了一个可在多个源之间共享的通用平台,并允许 targets 在编译器机械中大量重复使用。
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 联盟是一项共同努力,开发一个前瞻性的量子中间表示形式,目标是在量子生态系统中实现完全互操作性,减少各方的开发工作,并提供适合当前和未来的异类量子处理器的表示形式。
量子 SDK 和语言的出现和发展速度很快,同时出现的还有新的量子处理器,它们具有各自独特的功能。 为了提供新语言与新硬件功能的互操作性,生态系统必须开发和共享适用于当前和未来量子硬件的中间表示形式。
QIR 联盟在集体工作和伙伴关系下的目标是:
- 通过促进不同框架和语言之间的互操作性,减少各方所需的开发工作。
- 支持开发用于量子应用程序开发和量子编译器开发的共享库。
- 以最先进的编译器技术为基础,并利用现有的工具、库和从高性能计算中学到的知识。
- 允许经典和量子计算在硬件级别交互方式的增量和渐进式演进。
- 提供灵活性,以一种允许使用不同、差异化的硬件功能进行试验的方式轻松连接新兴技术。
QIR 联盟是 Linux 基金会联合开发基金会在开放标准方面工作的一部分。 创始成员包括Microsoft,以及昆蒂努姆(前霍尼韦尔)、橡树岭国家实验室、量子电路公司和里盖蒂计算。
由于 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 函数表示。
- 量子比特表示为指向名为 <
a0/> 的命名不透明结构类型的指针。
虽然 CreateBellPair
操作的 QIR 非常简单,但 QIR 继承了 LLVM 表达循环、条件和其他复杂控制流的所有功能。 QIR 还继承了 LLVM 表达任意经典计算的能力。
有关详细信息,请观看 2021 Q2B 活动中的 Microsoft 开发者会话。
在真实硬件上运行量子算法时,QIR 是必不可少的工具。 但即使你只想在更理论层面开发算法,中间表示也能起到重要作用。
例如,QIR 启用的一个应用程序是使用 Clang 编译器(LLVM 的 C 语言前端)将 QIR 编译为经典 target计算机的可执行计算机代码。 这为通过实现量子指令在 C 或 C++ 中生成模拟器提供了一条简单的路径,该路径可以简化量子模拟器的创建。
此外,可以使用中间表示生成稍后作为输入提供给量子模拟器(而不是实际设备)的代码,它可能使用不同于源代码的语言。 这样,便可以使用通用框架轻松比较和基准测试不同的语言或模拟器。
在代码优化方面,可以在中间级别执行优化步骤,使整体算法实现更高效。 调查输入代码的这种优化有助于更好地了解如何使算法更高效以及如何改进量子编程语言。
另一个应用程序是使用标准 LLVM“传递”基础结构来创建在 QIR 上运行的量子代码优化器。 独立于语言和硬件的 QIR 方法使得可以在不同的计算语言和计算平台上重用这些优化器,而几乎不需要付出任何努力。