4. 量子程序负载建模
量子软件与硬件基准测试的核心难点在于:被测对象不是一段固定不变的代码,而是一族结构、规模、纠缠模式各异的量子程序。如果只拿几个手写电路去跑分,结论既不可比也不可复现。负载建模要解决的问题,就是把"量子程序"抽象成一组可描述、可采样、可参数化的结构特征,并据此构建代表性负载集合与生成器。本节围绕电路结构、门类型、并行度、纠缠模式、测量模式五个维度展开,并给出一个可落地的参数化生成器设计。
一、负载建模的五个结构维度
一个量子电路可以被拆解为若干可量化的结构特征,这些特征共同决定了它在硬件上的执行行为:
- 电路结构:量子比特数 n、电路深度 d、层(layer)的划分方式。深度通常按"可并行执行的门归入同一层"来统计,因此深度与并行度直接耦合。
- 门类型:单比特门(H、X、Rx、Rz 等)、双比特门(CX、CZ、iSWAP 等)、多比特门(CCX、MCX)。不同门在硬件上的保真度与时长差异可达一个数量级,门类型分布是负载画像的关键。
- 并行度:同一层内可同时执行的门数量,反映硬件并行通道的利用潜力。并行度低意味着串行等待多,深度大。
- 纠缠模式:双比特门在比特对上的分布形态,常见有线性链(linear)、环形(ring)、全连接(all-to-all)、星形(star)、随机稀疏(random sparse)。纠缠模式决定了需要多少 SWAP 路由,是映射开销的主要来源。
- 测量模式:末端全测量、部分测量、中间测量与经典反馈(动态电路)、以及测量基选择(Z 基、X 基、贝尔基)。测量模式影响采样次数与后处理复杂度。
这五个维度并非独立:提高并行度往往需要更丰富的纠缠连接,而纠缠连接又受硬件拓扑约束。负载建模的价值就在于把这些耦合关系显式参数化,使基准测试可以按维度扫描,而不是笼统地"跑一个电路"。
二、代表性负载集合的构建
代表性负载集合(representative workload suite)不是随机电路的堆砌,而是按"覆盖结构空间 + 对应真实应用"两条线索选取。实践中常用三类来源:
- 应用派生负载:从真实算法中提取电路骨架,如 QAOA 的代价层与混合层、VQE 的 UCCSD 拟设、量子傅里叶变换、Grover 迭代。这类负载结构真实,但规模受算法限制。
- 结构合成负载:按维度参数直接合成,如随机 Clifford 电路、量子体积(QV)风格的置换-纠缠层、Bernstein-Vazirani 线性结构。用于扫描规模与深度。
- 压力负载:刻意放大某一维度,如高并行度全连接纠缠、深串行链、密集中间测量,用于暴露硬件在特定资源上的瓶颈。
一个可用的负载集合应保证:每个维度至少有两个取值被覆盖,且存在交叉组合。例如 n ∈ {4, 8, 16, 27},深度 d ∈ {10, 50, 200},纠缠模式 ∈ {linear, ring, random},测量模式 ∈ {terminal, mid-circuit}。这样即使不做全组合,也能通过正交表选出约 12~16 个代表电路。
三、参数化生成器的设计
参数化生成器的目标是用一组参数确定性地产生电路,保证可复现。核心参数包括:比特数 n、层数 L、单/双比特门比例、纠缠拓扑、随机种子 seed、测量模式。生成流程按层推进:每层先按并行度上限选择参与比特,再按门类型分布采样门,最后按纠缠拓扑在相邻层之间插入双比特门。
下面给出一个基于 Qiskit 的生成器骨架,参数含义在注释中标明。示例参数与输出仅为教学演示,非实测结果。
from qiskit import QuantumCircuit
import numpy as np
def gen_workload(n=8, layers=20, p2=0.4, topology="linear",
measure="terminal", seed=42):
rng = np.random.default_rng(seed)
qc = QuantumCircuit(n, n)
# 预生成纠缠边集合
if topology == "linear":
edges = [(i, i+1) for i in range(n-1)]
elif topology == "ring":
edges = [(i, (i+1) % n) for i in range(n)]
else: # random sparse
edges = [(i, j) for i in range(n) for j in range(i+1, n)
if rng.random() < 0.3]
for layer in range(layers):
# 单比特门层:按并行度上限随机选比特
active = rng.choice(n, size=max(1, n//2), replace=False)
for q in active:
qc.h(q) if rng.random() < 0.5 else qc.rz(rng.uniform(0, 6.28), q)
# 双比特门层:按 p2 概率从边集合采样
for (a, b) in edges:
if rng.random() < p2:
qc.cx(a, b)
if measure == "mid-circuit" and layer % 5 == 4:
qc.measure(active[0], active[0])
if measure == "terminal":
qc.measure(range(n), range(n))
return qc
调用 gen_workload(n=8, layers=20, p2=0.4, topology="ring", seed=7) 会得到一个 8 比特、20 层、环形纠缠、末端全测量的电路。改变 seed 即可在同一结构族内采样不同实例,用于统计稳定性评估。
四、结构特征与硬件指标的对应关系
负载建模最终要服务于"解释硬件表现"。下表给出结构维度与常见硬件指标的定性对应,帮助在结果异常时快速定位是负载哪一维在起作用。
| 结构维度 | 主要影响的硬件指标 | 典型现象 |
|---|---|---|
| 电路深度 | 总执行时间、退相干误差 | 深度翻倍,保真度近似指数下降 |
| 双比特门比例 | 门错误率、串扰 | CX 占比升高,整体保真度显著下降 |
| 并行度 | 吞吐、串扰 | 高并行时相邻比特串扰增大 |
| 纠缠拓扑 | SWAP 数、映射开销 | 全连接在稀疏拓扑上 SWAP 激增 |
| 测量模式 | 采样时间、后处理 | 中间测量引入延迟与反馈开销 |
下图把上述五个维度、生成器参数与硬件指标串成一条信号链,展示从参数输入到结果归因的完整路径。
五、从负载集合到基准结论
构建好负载集合与生成器后,基准测试的执行应遵循"固定结构、扫描参数、重复采样"的原则。对每个代表电路,固定 seed 生成实例,在目标硬件上重复执行 R 次(例如 R=10),记录每次的保真度、深度、SWAP 数与执行时间,取中位数与四分位距。若某电路的保真度方差异常大,通常说明该结构对硬件校准状态敏感,应单独标注。