NVIDIA CUDA-Q 0.12 引入了新的仿真工具,可加速研究人员开发量子应用和设计高性能量子硬件。
借助新的 run
API,用户可以获得有关模拟的单个运行(或镜头)的更详细统计数据,而不仅仅局限于模拟的聚合统计输出。对于研究人员来说,获取原始数据对于各种用例非常重要,例如分析量子位之间的噪声相关性、结果后选择、精确的电路基准测试等。
0.12 版本还为 CUDA-Q 动态后端添加了其他功能,使用户能够模拟量子系统的演化。这是建模和改进量子硬件的重要功能。此版本增加了对多对角线稀疏矩阵的支持,并对状态和运算符进行了批处理,使用户能够扩展动态技术。CUDA-Q Dynamics 现在还支持通用超级运算符方程,为研究人员提供了更大的灵活性。
CUDA-Q 是一个开源项目,此版本包含 unitaryHACK 活动的社区贡献以及 Python 3.13 支持。本文详细介绍了其中一些新功能。如需了解详细信息,请参阅 CUDA-Q 0.12 版本说明。
实现更具表现力的应用
CUDA-Q 是从头开始构建的,可支持编写混合量子-经典应用程序,使用内核编程模型来编排 QPU、GPU 和 CPU。在量子设备上运行的逻辑封装在量子内核中。执行内核有多种方式。其中一种方法是使用 sample
API,该 API 返回内核中量子位测量计数的聚合统计数据。
例如,对于一个需要三个量子位并对其应用 GHZ 状态的内核,使用此内核调用 sample
并指定 1000 次测量,将返回在 1000 次测量中观察到的测量结果的聚合统计数据:{ 000:492 111:508 }。正如 GHZ 状态所预期的那样,000 和 111 的结果的出现概率大致相等。但是,无法了解每个镜头更详细的信息。
import cudaq
@cudaq.kernel
def simple_ghz(num_qubits: int) -> int:
qubits = cudaq.qvector(num_qubits)
# Create GHZ state
h(qubits[0])
for i in range(1, num_qubits):
x.ctrl(qubits[0], qubits[i])
result = 0
for i in range(num_qubits):
if mz(qubits[i]):
result += 1
return result
shots = 20 # using small number of shots for simplicity
sample_results = cudaq.sample(simple_ghz, 3, shots_count=shots)
print(f"Sample results: {sample_results}")
run_results = cudaq.run(simple_ghz, 3, shots_count=shots)
print(f"Run results: {run_results}")
$ python3 test.py
Sample results: { 000:11 111:9 }
Run results: [0, 3, 0, 0, 0, 0, 3, 0, 0, 3, 3, 3, 3, 3, 0, 3, 0, 3, 3, 3]
与 sample
API 不同,run
API 保留了每个镜头返回的单独值,这在应用程序需要分析返回结果的分布时非常有用。借助 run,内核可以更具表现力,并对特定量子位进行条件测量。这些内核的返回值将是显式的,并且可以包含多种数据类型,包括使用 Python 数据类的自定义数据类型。
此外,run
还具有异步版本 run_async
,适用于长时间运行的执行。目前,仅支持 run
和 run_async
作为仿真后端。如需了解详情和代码示例,请参阅 CUDA-Q 文档。
实现更好的动态仿真性能
CUDA-Q 动态后端支持量子动力学系统的设计、仿真和执行。0.12 版本为该后端添加了多项增强功能。
此前,系统动力学仅限于由哈密尔顿算符和坍缩算符指定的 Lindblad 主方程。现在,用户可以模拟任何任意状态演化方程,将演化指定为通用超级算子。超级运算符可以构建为运算符实例的左乘和/或右乘操作的线性组合。
还增加了对多对角线稀疏矩阵的更新支持。根据算子矩阵的稀疏程度或子系统维度,CUDA-Q 将自动使用密集或多对角线数据格式以获得最佳性能。
CUDA-Q evolve
API 能够随着时间的流逝演化多个初始状态和多个哈密尔顿量。在 0.12 版本中,状态和哈密尔顿量都可以分批处理到多个 GPU 上。这可以显著提高模拟许多相同的小系统动力学以进行参数扫描或断层扫描的性能。可以以类似的方式对坍缩算子和超级算子进行批处理。
例如,电驱动硅自旋量子位的动力学模拟涉及振幅值的参数扫描,并为每个振幅值创建哈密顿量。如果不进行批处理,这将导致 evolve
被多次调用,每个振幅值调用一次。通过批处理,用户可以创建以下具有 1,024 个不同参数值的哈密尔顿批处理:
# Sweep the amplitude
amplitudes = np.linspace(0.0, 0.5, 1024)
# Construct a list of Hamiltonian operators for each amplitude so that we can
# batch them all together
batched_hamiltonian = []
for amplitude in amplitudes:
# Electric dipole spin resonance (`EDSR`) Hamiltonian
H = 0.5 * resonance_frequency * spin.z(0) + amplitude * ScalarOperator(
lambda t: 0.5 * np.sin(resonance_frequency * t)) * spin.x(0)
# Append the Hamiltonian to the batched list
# This allows us to compute the dynamics for all amplitudes in a single
# simulation run
batched_hamiltonian.append(H)
然后在一次调用中使用它来进行进化:
results = cudaq.evolve(
batched_hamiltonian,
dimensions,
schedule,
psi0,
observables=[boson.number(0)],
collapse_operators=[],
store_intermediate_results=cudaq.IntermediateResultSave.EXPECTATION_VALUE,
integrator=ScipyZvodeIntegrator())
在具有不同批量大小的 NVIDIA H100 GPU 上运行此示例,可以获得图 1 中针对不同参数值的结果。Hamiltonian 运算的批次越多,整体运行时间越短。将所有 1,024 个 Hamiltonian 汇集到一个 evolve
调用中,与不汇集相比,速度可提升 18 倍。

有关代码示例等更多详细信息,请参阅 CUDA-Q 文档。
unitaryHack 社区对 CUDA-Q 0.12 的贡献
unitaryHACK 是一个开源量子计算堆栈黑客松,由 Unitary Foundation 组织,Unitary Foundation 是一家非营利组织,通过开源项目、小额资助和社区活动为量子计算社区提供支持。作为最近的活动赞助商,NVIDIA 提交了五个 CUDA-Q 赏金,在 CUDA-Q 0.12 中产生了以下三个社区贡献:
- Gopal-Dahale 还添加了一个使用动力学准备离子阱 GHZ 状态的代码示例。该示例基于论文《热阱离子的多粒子纠缠》。
- ACE07-Sev 添加了使用 MPS 顺序编码进行近似状态准备的教程,展示了如何通过将初始状态向量分解为矩阵乘积状态来准备初始状态。在准备任意输入状态以在量子硬件上运行时,这非常有用。在这种情况下,矩阵乘积状态分解可确保输入状态向量具有低深度近似电路。
- Randl 补充了获取与量子内核关联的矩阵的初始实现。这个新 API 返回表示给定内核执行路径的酉矩阵(即迹)。
CUDA-Q 是一个开源项目,全年接受社区贡献。如需了解更多信息,请访问 GitHub 上的 NVIDIA/cuda-quantum。
开始使用 CUDA-Q
访问 CUDA-Q 快速入门,了解更多信息并开始使用。探索 CUDA-Q 应用和动态示例,并在 NVIDIA/cuda-quantum GitHub 资源库上与团队交流。如需了解有关其他加速量子超级计算工具的更多信息,请查看 NVIDIA Quantum。