RISC-V 量子拡張の仕様検討

RISC-V量子拡張は, 「RiscV.RV32IU」として @k_yamaz 蛙 が提案しています.
(詳しくは, 技術ブログ Qiita に投稿した RISC-Vの量子計算拡張 をご参照ください. )
思いつきなどをメモしていきます.

RISC-V 量子拡張 で検討した内容から, 次の点を改善しました.
1量子ビット演算で全量子ビットに Hゲートをかける場合は, ユースケースとしては多く発生するのですが, 1量子ビット演算は
1命令セットで1量子ビットずつの指定しかできないため, 呼び出し数が多くなることが容易に想定されます.
そこでマスク指定した量子ビットに対して同じユニタリ操作ができるように変更しました.

量子レジスタ

量子計算の拡張セットでは, レジスタについては q0 から q32 (q0 は qzero を表す)とします.

拡張版:量子命令セット

1
2
3
4
5
6
7
8
9
10
qmeas.k   rd rs1 rs2 qimm6 31=1 14..12=0 6..2=0x02 1..0=3  # quantum measurement
qtelep.k rd rs1 rs2 qimm6 31=0 14..12=0 6..2=0x02 1..0=3 # quantum teleportation
qtocx.k rd rs1 rs2 qimm6 31=1 14..12=4 6..2=0x02 1..0=3 # quantum two-qubit operator CX-gate
qootdg.k rd rs1 rs2 qimm6 31=0 14..12=1 6..2=0x02 1..0=3 # quantum one-qubit operator T^{\dag}-gate
qoosdg.k rd rs1 rs2 qimm6 31=0 14..12=2 6..2=0x02 1..0=3 # quantum one-qubit operator S^{\dag}-gate
qooz.k rd rs1 rs2 qimm6 31=0 14..12=3 6..2=0x02 1..0=3 # quantum one-qubit operator Z-gate
qoox.k rd rs1 rs2 qimm6 31=0 14..12=4 6..2=0x02 1..0=3 # quantum one-qubit operator X-gate
qoos.k rd rs1 rs2 qimm6 31=0 14..12=5 6..2=0x02 1..0=3 # quantum one-qubit operator S-gate
qoot.k rd rs1 rs2 qimm6 31=0 14..12=6 6..2=0x02 1..0=3 # quantum one-qubit operator T-gate
qooh.k rd rs1 rs2 qimm6 31=0 14..12=7 6..2=0x02 1..0=3 # quantum one-qubit operator H-gate
  • 量子ビット間の移動(qtelep.k)

量子レジスタ rs1 の rd で指定された位置の量子ビットの状態を, 量子レジスタ rs2 の qimm6 で指定された位置の量子ビットに量子テレポーテーションします.
qimm6(30) = 1 のときは, rd や qimm6(25-29) に関わらず, rs1 の全量子ビットの状態を rs2 に量子テレポーテーションします.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 qimm6 rs2 rs1 000 rd 0001011
  • 量子レジスタの1量子ビットの初期化

量子レジスタ rs2 の qimm6 で指定された位置の量子ビットの状態を初期化します.
qimm6(30) = 1 のときは, qimm6(25-29) に関わらず, rs2 の全量子ビットの状態を初期化します.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 qimm6 rs2 rs1(=q0) 000 rd 0001011
  • 1量子ビット演算

量子レジスタ rs1 に対して, qimm6 で指定したビット位置に, Unitray で示されたユニタリ行列を作用する命令です.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 qimm6 rs2(=q0) rs1 Unitary rd 0001011
14 .. 12 Unitary opcode
001 $T^{\dagger}$ qootdg.k
010 $S^{\dagger}$ qoosdg.k
011 $Z$ qooz.k
100 $X$ qoox.k
101 $S$ qoos.k
110 $T$ qoot.k
111 $H$ qooh.k
  • 複数量子ビットに対する同一1量子ビット演算(古典レジスタrs2にマスク情報が保持されている前提)

古典レジスタ rs2 の値で指定された量子ビット(マスクで指定)に対して, 量子レジスタ rs1 に, Unitary で示されたユニタリ行列を作用する命令です.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 qimm6(=000000) rs2( $\ne$ q0) rs1 Unitary rd 0001011

※ Unitary は「1量子ビット演算」と同じです.

  • 2量子ビット演算

量子レジスタ rs2 の qimm6[control] で指定したビット位置を制御ビット, 量子レジスタ rs1 の rd[target] で指定したビット位置を操作ビットとして 2量子ビットの Control Unitary を作用する命令です.
qimm6(30) = 1 のときは, qimm6(25-29) に関わらず, rs2 の全量子ビットを制御ビットとして, rs1 の rs2 と同じ位置の量子ビットを操作ビットとして 2量子ビットの Control Unitary を作用します.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 qimm6 rs2 rs1 Unitary rd 0001011
14 .. 12 Unitary opcode
100 CNOT qtocx.k
  • 1量子ビットの測定(qmeas.k)

量子レジスタ rs1 の qimm6 で指定された位置の量子ビットの状態を測定して, 古典レジスタ rd の qimm6 ビット位置に値を保持します.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
1 qimm6 rs2(=q0) rs1 000 rd 0001011
  • 複数量子ビットの測定(古典レジスタrs2にマスク情報が保持されている前提)

古典レジスタ rs2 の値で指定された量子ビット(マスクで指定)に対して, 量子レジスタ rs1 の状態を測定して, 古典レジスタ rd のビット位置に値を保持します.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
1 qimm6(=000000) rs2( $\ne$ q0) rs1 000 rd 0001011