OpenQASM是什么?
网友回复
OpenQASM(open quantum assembly language),即开放量子汇编语言,是一种命令式编程语言,它的特性类似于硬件描述语言(hardware description language),由 IBM 于 2017 年 7 月在其量子计算平台推出,它能够使用电路模型、基于测量的模型和近期量子计算实验来描述通用的量子计算,也是目前适用范围较广的量子汇编语言,目前已更新至 3.0 版本。
OpenQASM 作为一个开源框架,广泛用于基于门的设备的量子程序规范。借助 OpenQASM,用户可以对构成量子计算基石的量子门和测量操作进行编程。目前,许多量子编程库使用先前版本的 OpenQASM 2.0 来描述简单的程序。 OpenQASM 在框架中提供了一组参数化的物理逻辑门和并发的实时经典计算的集合。它的主要目标是作为高级编译器与量子硬件通信的中间表示载体,在表示形式上,也考虑到了人们使用它时的易读性。特别是,该语言允许同一程序的不同表示形式,所以 OpenQASM 可以由 Composer 生成,也支持手写,或者由更高层次的软件工具来完成,比如 ProjectQ、Quil、Liquid 等等。设计目标
OpenQASM 3.0 与之前版本相比,增加了更多功能,例如脉冲电平控制、门定时和经典控制流程,以弥补最终用户界面和硬件描述语言之间的差距。总结起来,基本集中在以下三个方面: 具有经典逻辑的更广泛的计算系列。OpenQASM 3.0 引入经典控制流、指令和数据类型来定义包括经典数据实时计算的电路。外部机制允许对作用于运行时数据的通用经典计算进行不透明引用。 显式计时。OpenQASM 3.0 引入了一种灵活的机制来描述指令调度的设计意图,同时保持独立于门校准确定的特定持续时间。例如,这可以实现动态去耦,同时保留电路的栅极级描述。 嵌入式脉冲电平定义。一种可扩展的机制,用于将低级定义附加到门。这与校准任务特别相关,校准任务使用最容易在门级描述的误差放大序列来优化脉冲参数。 细节实现 遵循上述设计目标,OpenQASM 3.0 相比之前的 OpenQASM 2.0 规范进行了大幅扩展升级。增加了许多经典控制流和计算的新功能,使编写量子算法更容易,并描述构成这些算法一部分的经典数据处理。然而,该语言并非设计用于通用经典计算,并且在短期内,任何执行 OpenQASM 3.0 程序的硬件都不太可能支持该语言可以描述的全套数据操作。 OpenQASM 3.0 的硬件能够保证它们在运行时将处理性能稳定在高效和实时执行的操作上。这组操作在不同的实现工具下,实现方式会根据硬件种类略有所不同,需要提前了解不同硬件在运行时可以实现哪些语言功能。随着时间的推移,随着量子控制的要求变得不那么繁重,实现组件可能会变得更加强大。 在将来 OpenQASM 3.0 的编译器也会支持一些经典操作,这些经典操作会被合理地判断为编译时常量,并在编译时执行这些操作。上面所说到的“合理推断”是指声明为常量的值以及字面意义。例如,这意味着“科学计算器函数”(如sin、exp 等)将始终对只涉及兼容类型的字面符号和声明为常量的值的表达式起作用,而且编译器会将这些表达式完全折叠成单个常量。具体能够如何实现,还需要我们继续等待相关的适配工作。示例
因为目前不是所有基于门的量子设备和模拟器都支持 OpenQASM 3.0 ,所以在一些代码示例中,将会使用部分 OpenQASM 2.0 的内容。 首先展示一下如何利用 OpenQASM 中的语法规则设置部分量子门: OPENQASM 2.0; include "qelib1.inc"; qreg q[10]; creg c[10]; x q[0]; h q[1]; tdg q[2]; sdg q[2]; cx q[0],q[2]; cx q[1],q[4]; u1(pi) q[0]; u2(pi,pi) q[1]; u3(pi,pi,pi) q[2]; cz q[2],q[5]; ccx q[3],q[4],q[6]; cu3(pi,pi,pi) q[0],q[1]; measure q[2] -> c[2];measure q[0] -> c[0];
可以看到,OpenQASM 会直接对需要进行转置共轭操作的量子逻辑门与量子线路进行直接转化;并且在对量子程序转化 QASM 指令集之前,会对其中包含的控制操作进行分解。 目前在已开源的量子编程框架中,本源量子的 QPanda 框架提供了 QASM 转换的工具接口的,接口为std::string convert_qprog_to_qasm(QProg &, QuantumMachine*),使用方式也较为简单。接下来我们可以来看看QPanda框架是如何进行QASM转换的: #include "QPanda.h" USING_QPANDA int main(void) { auto qvm = CPUQVM(); qvm.init(); auto prog = QProg(); auto cir = Circuit(); auto q = qvm.qAllocMany(6); auto c = qvm.cAllocMany(6); // 构建量子程序 cir << Y(q[2]) << H(q[2]); cir.setDagger(true); auto h1 = H(q[1]); h1.setDagger(true); prog << H(q[1]) << X(q[2]) << h1 << RX(q[1], 2 / PI) << cir << CR(q[1], q[2], PI / 2) <