查看原文
其他

教你如何使用QPanda解决量子位映射问题

OriginQ 本源量子 2021-02-13

人类即将进入一个量子技术发展的关键新时代「NISQ(Noisy Intermediate-Scale Quantum,含噪声的中型量子)」,使用 NISQ 技术的设备将成为探索多体量子物理学的有用工具,我们应该将其看作是向未来更强大的量子技术迈出的重要一步。
近十年,量子计算因其能以指数速度加速一些重要算法而受到广泛关注。但NISQ设备与量子计算算法的硬件要求(例如尺寸和可靠性)之间存在着差距。
为了弥合差距,质量控制需要抽象层和工具链来翻译和优化量子程序。量子计算编译器通常会在多个阶段将高级量子计算代码转换为(优化的)电路级汇编代码。

为了使用NISQ硬件,必须将量子线路编译到目标设备,其中包括将逻辑量子位映射到设备的物理量子位。然而量子计算设备存在物理量子比特之间的有限连接,使得只能在有限的量子位对上应用双门。

量子程序应用到目标设备时,必须转换原始的量子程序以适应硬件限制,让双量子比特门中的两个量子比特能够满足物理拓扑结构,从而让双量子位门正常作用。

例如IBM QX5结构的耦合图,其中Q1表示编号为1的物理比特,能与Q1相互作用的只有Q0和Q2物理比特。


在量子程序编译到目标设备时,需要使双量子比特门满足约束。对于要实现 “CNOT q1, q3” 这样的双比特操作,则需要完成逻辑比特q1 到Q2, q3 到Q3的映射,从而使”CNOT q1,q3” 操作符合IBM QX5这样的芯片拓扑结构。

在初始映射无法满足所有双量子比特门操作时,解决这个问题的一个常用方法就是插入额外的SWAP门操作,以便将逻辑量子位“移动”到它们可以相互作用的位置。即逻辑量子比特映射到设备的物理量子比特。

例如”CNOT q1,q3”在初始映射中限定q1映射到Q1、q3映射到Q3,为了实现逻辑门操作,就需要插入”SWAP q1,q2”,即“SWAP q1,q2;CNOT q2,q3” ,从而实现”CNOT q1,q3”操作。

在解决映射问题过程中我们需要尽可能的保持线路的保真度以及提高线路的执行速度即在线路能够正常在芯片上运行的同时,要保证插入最少的SWAP门操作。

提高映射方案可行性的两种有效方法

目前,本源量子研究团队采用两种有效方法用以提高映射方案可行性,已在QPanda2成功实现。


      通过采用量子程序分层以及A*搜索算法,使用当前层映射关系对本层其他量子位产生的插入SWAP消耗和当前层映射关系对下一层产生的插入SWAP消耗作为启发式函数,在每层中找到一个插入SWAP消耗近似最少的映射关系,从而使得算法的整体消耗上近似达到最少。
      中国科学技术大学张昱老师团队提出解决映射问题的全新思路,并与和本源量子团队合作,在QPanda2上成功实现。成果论文《CODAR: A Contextual Duration-Aware Qubit Mapping for Various NISQ Devices》已于预印本平台arXiv.发布。
研究团队通过采用一种上下文敏感和持续时间感知的重映射算法,该算法能够感知门持续时间差和程序上下文,使得它能够从程序中提取更多的并行性。从而极大的减少量子程序的执行时间。


接口示例:

#include"Core/Core.h"using namespacestd;using namespaceQPanda;int main(){ auto qvm = new CPUQVM(); qvm->init(); auto q = qvm->allocateQubits(4); auto c = qvm->allocateCBits(4); QProg srcprog; QCircuit qft = createEmptyCircuit(); for (auto i = 0; i < q.size(); i++) { qft << H(q[q.size() - 1 - i]); for (auto j = i + 1; j < q.size();j++) { qft << CR(q[q.size() - 1 - j], q[q.size() - 1 - i], 2 * PI / (1<< (j - i + 1))); } } srcprog << qft << U2(q[1], PI/2,-PI/4) << U3(q[2], PI/2, -PI/3, PI/4); qvm->directlyRun(srcprog); auto r1 = qvm->PMeasure_no_index(q); QProg outprog = qcodar_match(srcprog, q,qvm, SIMPLE_TYPE, 2, 3, 5); qvm->directlyRun(outprog); auto r2 = qvm->PMeasure_no_index(q); std::cout <<"映射前的概率测量结果:"<< std::endl; for (int i = 0; i < r1.size(); i++) std::cout << r1[i] <<std::endl; std::cout <<"映射后的概率测量结果:"<< std::endl; for (int i = 0; i < r2.size(); i++) std::cout << r2[i] <<std::endl; qvm->finalize(); delete qvm; return 0;}

具体步骤如下:

1.创建量子虚拟机、量子寄存器、经典寄存器
2.编写量子程序 srcprog ,对该量子程序进行概率测量得到结果 r1
3.接着调用 qcodar_match() 对 srcprog 进行符合特定物理结构的线路映射,得到适配特定物理结构的量子程序 outprog
4.对量子程序 outprog 进行概率测量得到结果 r2
5.由于量子程序映射只是对原线路增加额外的 SWAP 操作,以适配物理拓扑结构,并不影响线路的结构。打印映射前后的r1和r2,对比概率测量结果 ;如果结果一致,则线路映射正确。


运行结果如下

映射前的概率测量结果:

0.005361650.005361650.031250.031250.031250.031250.1821380.1821380.005361650.005361650.031250.031250.031250.031250.1821380.182138



映射后的概率测量结果:

0.005361650.005361650.031250.031250.031250.031250.1821380.1821380.005361650.005361650.031250.031250.031250.031250.1821380.182138




新方法的亮点

过去的研究思路上未考虑程序上下文和门持续时间差,仅考虑耦合情况。且使用A*算法,设计启发式函数也仅仅是让线路符合芯片耦合时使用较少的SWAP的消耗。

这一新方法的设计不仅简化了映射问题,让映射后的线路有更好的执行速度,同时也考虑到SWAP的消耗问题,设计了启发式函数以减少消耗。

新方法的提出,为解决量子比特映射问题开辟了全新思路,也将推进量子程序适配拓扑结构的研究进展。

点击文末“阅读原文”,即可获取量子程序匹配拓扑结构详细案例~


延伸阅读

●  十分钟看懂量子计算机到底是什么
●  IBM抢先出手将Archer纳入麾下,黑马级量子硬件技术即将现世?
●  量子计算机群!IBM量子计算机增至18台
  本源劳动者 | 用知识产权为中国量子计算赢得话语权

点击“阅读原文”,即可获取量子程序匹配拓扑结构详细案例~

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存