人类即将进入一个量子技术发展的关键新时代「NISQ(Noisy Intermediate-Scale Quantum,含噪声的中型量子器件)」,使用 NISQ 技术的设备将成为探索多体量子物理学的有用工具,我们应该将其看作是向未来更强大的量子技术迈出的重要一步。

近十年,量子计算因其能以指数速度加速一些重要算法而受到广泛关注。但NISQ设备与量子计算算法的硬件要求(例如尺寸和可靠性)之间存在着差距。

为了弥合差距,质量控制需要抽象层和工具链来翻译和优化量子程序。量子计算编译器通常会在多个阶段将高级量子计算代码转换为(优化的)电路级汇编代码。

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

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

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

本源量子QPanda为解决量子比特映射问题开辟新思路-量子客

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

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

例如”CNOT $q_1$, $q_3$”在初始映射中限定$q_1$映射到$Q_1$、$q_3$映射到$Q_3$,为了实现逻辑门操作,就需要插入”SWAP $q_1$,$q_2$”,即“SWAP $q_1$,$q_2$;CNOT $q_2$,$q_3$” ,从而实现”CNOT $q_1$,$q_3$”操作。

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

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

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

1、通过采用量子程序分层以及A*搜索算法,使用当前层映射关系对本层其他量子位产生的插入SWAP消耗和当前层映射关系对下一层产生的插入SWAP消耗作为启发式函数,在每层中找到一个插入SWAP消耗近似最少的映射关系,从而使得算法的整体消耗上近似达到最少。

2、中国科学技术大学张昱老师团队提出解决映射问题的全新思路,并与和本源量子团队合作,在QPanda2上成功实现。成果论文《CODAR: A Contextual Duration-Aware Qubit Mapping for Various NISQ Devices》已于预印本平台arXiv.发布,且已被国际计算机硬件及设计自动化旗舰会议DAC2020接受。

研究团队通过采用一种上下文敏感和持续时间感知的重映射算法,该算法能够感知门持续时间差和程序上下文,使得它能够从程序中提取更多的并行性。从而极大的减少量子程序的执行时间。

#include "Core/Core.h"
using namespace std;
using namespace QPanda;
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.00536165
0.00536165
0.03125
0.03125
0.03125
0.03125
0.182138
0.182138
0.00536165
0.00536165
0.03125
0.03125
0.03125
0.03125
0.182138
0.182138

映射后的概率测量结果:

0.00536165
0.00536165
0.03125
0.03125
0.03125
0.03125
0.182138
0.182138
0.00536165
0.00536165
0.03125
0.03125
0.03125
0.03125
0.182138
0.182138

新方法的亮点

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

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

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

附:https://github.com/OriginQ/QPanda-2

 

本文由本源量子发布,版权归本源所有,更多请关注本源量子官方微信。

www.originqc.com.cn