NVIDIA CUDA-Q(以前称为 NVIDIA CUDA Quantum)是一个开源编程模型,用于构建充分利用 CPU、GPU 和 QPU 计算能力的混合量子经典应用程序。目前开发这些应用程序具有挑战性,需要灵活、易于使用的编码环境以及强大的量子模拟功能,以高效地评估和提高新算法的性能。
CUDA-Q 是专门为实现这一点而构建的平台。它能够在模拟和各种实际 QPU 硬件后端之间轻松切换,这使其成为量子应用开发的长期解决方案。最近的 v0.8 版本进一步提高了 CUDA-Q 模拟性能、开发者体验和灵活性。
在本文中,我们将讨论CUDA-Q v0.8:
- 状态处理
- 泡利语词
- 自定义单元运算
- 可视化工具
- NVIDIA Grace Hopper 集成
状态处理
量子态准备是有用的量子算法的核心组件,但它通常是最复杂、最昂贵的模拟元素之一。在内存中保留相同的状态并对其进行重复使用,可以在使用不同参数的状态多次或遵循经典的预处理和后处理步骤时优化模拟。
您现在可以根据提供的状态向量构建 CUDA-Q 核函数。以下代码示例通过指定对应于 2 量子位状态的 4 个条目状态向量来说明这一点。
c = [.707, 0, 0, .707]
@cudaq.kernel
def initial_state():
q = cudaq.qvector(c)
执行量子电路后,该状态现在可以保留在 GPU 内存上,并使用优化的内存传输工具轻松传递给未来的内核。
状态处理工具对于本质上具有递归或迭代性的量子算法尤其有用。
图 1 是后续量子运算的示例示例,(绿框) 是根据先前状态的测量结果 ().
如果没有状态处理, step 需要对之前的所有操作 (灰色框) 进行模拟,以生成 之前 应用后,该过程将继续。
在 GPU 显存中保留先前的状态,无需执行之前的所有操作,从而显著提高性能
模拟 Trotter 动力学是一个状态处理性能提升的很好的量化示例。在 Heisenberg Hamiltonian 模拟的 25 量子位基准测试中(图 2),保存先前的状态意味着每个步骤所需的时间大致相同。如果没有状态处理,步骤会变得越来越繁琐。对于 100 个步骤的模拟,状态处理会使总模拟时间加快 24 倍,令人印象深刻。
Pauli 语词
Pauli 语词单量子位 X、Y、Z、I 泡利运算符 (P) 的张量积。表示这些运算符 () 结果为单个量子位旋转门:Rx(), Ry(), Rz()。
某些算法需要从整个 Pauli 语词的指数化中衍生出更复杂的运算。
CUDA-Q v0.8 现在包含一个新的pauli_word
可以输入到量子核的类型,并将其转换为量子电路运算,exp_pauli
.以下代码示例展示了如何使用 Pauli 词及其相关系数列表应用以下运算:
words = ['XYZ', 'IXX']
coefficients = [0.432, 0.324]
@cudaq.kernel
def kernel(coefficients: list[float], words: list[cudaq.pauli_word]):
q = cudaq.qvector(3)
for i in range(len(coefficients)):
exp_pauli(coefficients[i], q, words[i])
Pauli 语词及其各自的系数作为列表输入核,然后转换为量子电路运算,exp_pauli
。上一节中讨论的 Trotter 模拟示例将此功能用于 Hamiltonian 模拟。有关更多信息,请参阅trotter_kernel_mode.pyGitHub 上的脚本。
自定义单元运算
在设计更抽象、有 oracles 或没有确切已知的门集的量子算法时,使用单元运算有时比使用gate更受欢迎。
您现在可以在 CUDA-Q 内核中执行自定义单元操作。以下代码示例展示了如何将自定义单元操作指定为 NumPy 数组,并将其命名,然后在核函数中使用。自定义标准 X 门指定为包含行的 2 × 2 单元矩阵[0,1]
和[1,0]
.该示例还演示了如何使用一个或多个量子位的受控运算来应用自定义元。
import numpy as np
cudaq.register_operation("custom_x", np.array([0, 1, 1, 0]))
@cudaq.kernel
def kernel():
qubits = cudaq.qvector(2)
h(qubits[0])
custom_x(qubits[0])
custom_x.ctrl(qubits[0], qubits[1])
counts = cudaq.sample(kernel)
counts.dump()
可视化工具
可视化工具对于学习量子计算概念、设计算法和协作开展研究非常重要。2024 年 Unitary Hack 活动的参与者为 CUDA-Q 提供了增强的量子电路和 Bloch 球体可视化。
任何内核都可以使用print(cudaq.draw(kernel))
命令。默认情况下,ASCII 表示在终端中打印 (图 4)。
LaTeX 是一种文本准备和排版工具,通常用于准备科学出版物。以下命令打印 LaTeX 字符串:
print(cudaq.draw(‘latex’, kernel))
要准备排版量子电路,请将字符串复制到任何 LaTeX 编辑器(例如 Overleaf)中,然后将其导出为 PDF。
CUDA-Q v0.8 现在还使用 QuTip(用于动态模拟的开源 Python 包)来可视化与单量子位状态对应的 Bloch 球体。图 6 显示了一个或多个 Bloch 球体的可视化详细示例。有关更多信息,请参阅 Qubit Visualization。
NVIDIA Grace Hopper 集成
现在,您可以使用 CUDA-Q 充分利用 NVIDIA GH200 超级芯片的全部性能,进一步突破量子模拟的极限。大内存带宽可显著加快量子系统的模拟速度,而在 GH200 超级芯片上进行模拟只需之前所需节点数量的四分之一。这对于通常受到内存限制的量子模拟尤为重要,因为它们通常受到内存带宽的限制。
CUDA-Q 入门
CUDA-Q 的持续改进为您提供了一个更高性能的平台,用于构建量子加速的超级计算应用程序。这是一个更高性能的模拟平台,基于 CUDA-Q 构建的应用程序也可以部署在未来实际量子计算所需的混合 CPU、GPU 和 QPU 环境中。
有关更多信息,请参阅以下资源:
- CUDA-Q 快速入门指南:快速设置环境。
- CUDA-Q 基础知识:编写首个 CUDA-Q 应用程序。
- CUDA-Q 示例和 CUDA-Q 教程:为您自己的量子应用程序开发获取灵感。
如需提供反馈和建议,请参阅/NVIDIA/cuda-quantumGitHub 库。