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)不是随机电路的堆砌,而是按"覆盖结构空间 + 对应真实应用"两条线索选取。实践中常用三类来源:

  1. 应用派生负载:从真实算法中提取电路骨架,如 QAOA 的代价层与混合层、VQE 的 UCCSD 拟设、量子傅里叶变换、Grover 迭代。这类负载结构真实,但规模受算法限制。
  2. 结构合成负载:按维度参数直接合成,如随机 Clifford 电路、量子体积(QV)风格的置换-纠缠层、Bernstein-Vazirani 线性结构。用于扫描规模与深度。
  3. 压力负载:刻意放大某一维度,如高并行度全连接纠缠、深串行链、密集中间测量,用于暴露硬件在特定资源上的瓶颈。

一个可用的负载集合应保证:每个维度至少有两个取值被覆盖,且存在交叉组合。例如 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 即可在同一结构族内采样不同实例,用于统计稳定性评估。

生成器应输出结构元数据(n、depth、单/双比特门计数、纠缠边数、测量次数),与电路一同保存。基准测试报告里若缺少这些元数据,结果无法归因。

四、结构特征与硬件指标的对应关系

负载建模最终要服务于"解释硬件表现"。下表给出结构维度与常见硬件指标的定性对应,帮助在结果异常时快速定位是负载哪一维在起作用。

结构维度主要影响的硬件指标典型现象
电路深度总执行时间、退相干误差深度翻倍,保真度近似指数下降
双比特门比例门错误率、串扰CX 占比升高,整体保真度显著下降
并行度吞吐、串扰高并行时相邻比特串扰增大
纠缠拓扑SWAP 数、映射开销全连接在稀疏拓扑上 SWAP 激增
测量模式采样时间、后处理中间测量引入延迟与反馈开销

下图把上述五个维度、生成器参数与硬件指标串成一条信号链,展示从参数输入到结果归因的完整路径。

生成器参数 n 比特数 L 层数 p2 双比特比例 topology 拓扑 seed 随机种子 电路结构特征 电路结构 / 深度 门类型分布 并行度 纠缠模式 测量模式 量子电路实例 结构元数据 门计数 / 深度 纠缠边集合 硬件执行 映射 / 路由 门调度 采样 硬件指标与归因 总执行时间 ← 深度 / 并行度 门错误率 ← 门类型 / 双比特比例 SWAP 开销 ← 纠缠拓扑 串扰水平 ← 并行度 / 邻接 采样与后处理 ← 测量模式 保真度衰减 ← 深度 × 门错误 结构元数据驱动归因

五、从负载集合到基准结论

构建好负载集合与生成器后,基准测试的执行应遵循"固定结构、扫描参数、重复采样"的原则。对每个代表电路,固定 seed 生成实例,在目标硬件上重复执行 R 次(例如 R=10),记录每次的保真度、深度、SWAP 数与执行时间,取中位数与四分位距。若某电路的保真度方差异常大,通常说明该结构对硬件校准状态敏感,应单独标注。

不要把不同 seed 生成的电路结果直接平均。同一结构族内不同实例的深度和门数可能不同,平均会掩盖结构差异。正确做法是先按结构元数据分组,再在组内统计。