在过去的十年里,量子计算从学术实验室跃入主流。创业公司和大公司都在努力制造更好的量子计算机。虽然目前尚不清楚我们离在常见问题上使用量子优势还有多远,但很明显,现在是构建交付有价值的量子应用所需工具的时候了。
首先,我们需要在理解量子算法方面取得进展。去年, NVIDIA 发布了 cuQuantum ,这是一款用于加速量子计算模拟的软件开发工具包( SDK )。在 GPU 上使用 cuQuantum 模拟量子电路,使算法研究的性能和规模远远超过了目前在量子处理单元( QPU )上可以实现的性能和规模。这为在理解如何充分利用量子计算机方面取得突破铺平了道路。
除了改进量子算法外,我们还需要充分利用 QPU 以及经典计算资源 CPU 和 GPU 。如今, NVIDIA 宣布推出 量子优化设备架构( QODA ) 是一个混合量子经典计算平台,其使命是实现这一效用。
随着量子计算的发展,所有有价值的量子应用都将是混合的,量子计算机将与高性能经典计算一起工作。 GPU 纯粹为图形而创建,并转化为 high-performance computing ( HPC )的基本硬件。这需要新的软件来实现强大而直接的编程。量子计算机从科学实验向有用加速器的转变也需要新的软件。
量子软件的这一新时代将实现性能混合计算,并为更广泛的科学家和创新者群体增加量子计算机的可访问性。
量子编程景观
在过去五年中,针对小规模、噪声量子计算架构的量子编程方法得到了发展。这一发展对算法开发人员来说意义重大,并使标准量子算法以及混合变分方法的早期原型化成为可能。
由于缺乏量子资源和硬件实现的实用性,大多数编程方法都处于纯 Python 级别,支持远程、基于云的执行模型。
随着量子体系结构的改进和算法开发人员考虑现有经典异构计算的真正量子加速,问题出现了:我们应该如何在传统高性能计算环境中支持量子协处理?
NVIDIA 是开发高性能计算编程模型、异构编译器平台和高级应用程序库的真正先驱,这些应用程序库可以通过一个或多个应用程序加速传统的科学计算工作流 NVIDIA GPU .
我们将量子计算视为异构高性能计算系统架构的另一个元素,并设想了一种编程模型,该模型将量子协处理无缝地结合到我们现有的系统中 CUDA 生态系统 . 在这方面,目前从 Python 语言级别开始的方法是不够的,最终将限制经典和量子计算资源的性能集成。
QODA 用于高性能计算
NVIDIA 正在开发一个开放规范,用于在高性能计算环境中编程混合量子经典计算架构。我们宣布 QODA 编程模型规范和相应的 NVQ ++编译器平台,支持后端不可知(物理、模拟)、单源、现代 C ++方法来实现量子加速高性能计算。
QODA 与现有的经典并行编程模型(如 CUDA 、 OpenMP 和 OpenACC )具有内在的互操作性。该编译器实现还将量子经典 C ++源代码表示降低为二进制可执行文件,这些二进制可执行文件本机以支持量子的模拟后端为目标。
该编程和编译工作流程通过与 GPU 处理和电路模拟的标准互操作性,实现了一个性能良好的编程环境,用于加速混合算法的研究和开发活动,这些处理和电路模拟可以从笔记本电脑扩展到分布式多节点、多 GPU 架构。
auto ghz = [](const int N) __qpu__ { qoda::qreg q(N); h(q[0]); for (auto i : qoda::irange(N-1)) { cnot(q[i], q[i+1]); } mz(q); }; // Sample a GHZ state on 30 qubits auto counts = qoda::sample(ghz, 30); counts.dump();
如代码示例所示, QODA 提供了一种类似 CUDA 的基于内核的编程方法,以现代 C ++为中心。您可以将量子设备代码定义为独立的函数对象或带有 _uqpu_uu 注释的 lambda ,以指示将编译到量子设备并在其上执行。
通过依赖自由函数上的函数对象( ZCK0 内核方法),您可以实现一种高效的方法来构建通用标准量子库函数,该函数可以将任何量子内核表达式作为输入。
这方面的一个简单示例是标准采样 QODA 函数(qoda::sample(...)
),它将量子内核实例和任何具体参数作为输入,并将观察到的量子比特测量位字符串的熟悉映射返回到相应的观察次数。
QODA 内核程序员可以访问与量子计算相关的某些内置类型(qoda::qubit
、qoda::qreg
、qoda::spin_op
等)、量子门操作以及从 C ++继承的所有传统经典控制流。
前面详细介绍的语言编译方法的一个有趣方面是能够编译包含 CUDA 内核、 OpenMP 和 OpenACC pragmas 以及更高级别的 CUDA 库 API 调用的 QODA 代码。此功能将使混合量子经典应用程序开发人员能够真正利用多 GPU 处理与量子计算。
未来的量子计算用例将需要经典的并行处理,例如数据预处理和后处理、标准量子编译任务和量子纠错的综合征解码。
量子经典应用的早期展望
针对噪声、短期量子计算架构的典型混合量子经典算法是变分量子特征解算器( VQE )。矢量量化方程的目标是根据量子力学的变分原理,计算给定量子力学算子(如哈密顿量)相对于参数化状态制备电路的最小特征值。
为给定的一组栅极旋转参数执行状态准备电路,并执行一组由量子力学算子的结构决定的测量,以计算这些具体参数的期望值。然后使用用户指定的经典优化器通过改变这些参数来迭代搜索最小期望值。
您可以在 QODA 编程模型中看到类似 VQE 的通用算法的样子:
// Define your state prep ansatz… auto ansatz = [](std::vector<double> thetas) __qpu__ { … Use C++ control flow and quantum intrinsic ops … }; // Define the Hamiltonian qoda::spin_op H = … use x, y, z to build up Hamiltonian … ; // Create a specific function optimization strategy int n_params = …; qoda::nlopt::lbfgs optimizer; optimizer.initial_parameters = qoda::random_vector(-1, 1, n_params); // Run the VQE algorithm with QODA auto [opt_val, opt_params] = qoda::vqe(ansatz, H, optimizer, n_params); printf("Optimal <H> = %lf\n", opt_val);
所需的主要组件是参数化的 ansatz-QODA 内核表达式,在代码示例中显示为采用std::vector<double>
的 lambda 。
这个 lambda 的实际主体取决于当前的问题,但您可以自由地使用标准 C ++控制流、作用域内量子内核调用和量子内在操作的逻辑集来构建这个函数。
下一个需要的组件是您需要计算其期望值的运算符。 QODA 将它们表示为内置的spin_op
类型,您可以通过 Pauli x(int)
、y(int)
和z(int)
函数调用以编程方式构建它们。
接下来,您需要一个经典的函数优化器,这是 QODA 语言规范中的一个一般概念,用于将子类化为特定的优化策略,基于梯度或无梯度。
最后,该语言公开了用于调用整个 VQE 工作流的标准库函数。它在 QODA 内核实例上参数化,该实例建模状态准备 ansatz ,该运算符需要以下值:
- 最小特征值
- 经典优化实例
- 变分参数的总数
然后返回一个结构化绑定,该绑定对状态准备电路的最优特征值和相应的最优参数进行编码。
前面的工作流非常通用,有助于开发变分算法,这些算法最终在量子核表达式、感兴趣的自旋算子和经典优化例程方面是通用的。
但它也展示了 QODA 编程模型的基本原理:提供描述量子代码表达式的核心概念,然后促进通用函数标准库的实用性,从而实现混合量子经典算法的可组合性。
QODA 早期兴趣计划
量子计算机有望帮助我们解决一些最重要的问题。我们正在向高性能计算和人工智能已经发挥关键作用的领域的科学家和专家开放量子计算,并实现当今最好的现有软件与量子软件的轻松集成。这将大大加速量子计算机实现其潜力。
QODA 提供了一个开放的平台来实现这一点, NVIDIA 很高兴与整个量子社区合作,使有用的量子计算成为现实。应用于 QODA 早期兴趣计划 以了解 NVIDIA quantum computing 的最新发展。
有关更多信息,请参阅 NVIDIA 量子计算解决方案 ,以及帖子、视频等。