RISC-V Quantum Extension
このプロジェクトの基礎となる RISC-V Quantum Extension について詳細を明かさずに進めていました. ここで, 改めて RISC-V Quantum Extension について解説します. RISC-Vには, 標準でカスタム拡張ができる領域が定義されています. そのカスタム拡張領域を使って量子拡張を定義します.
拡張ですから, 考えるのは“拡張命令”としてその拡張部分だけです. それ以外の命令セットは, RISC-Vの標準のものと同一となります. つまり, 所謂, 古典計算部分は標準的なRISC-Vの仕様がそのまま適用されます.
K extension
先ずは, この拡張の呼び方を考えます. 量子を示すのに都合がよさそうなQuantumの頭文字「Q」は「4倍浮動小数点」として予約されていますので使えません. そこで量子計算をロシア語で表記した「K」の記号を当てて, 量子計算拡張を「K extension」として提案します.
量子レジスタ
次に, 拡張命令の具体的な検討の前に, レジスタについて考える必要があります. 通常のRV32Iの仕様では 32bit レジスタの個数は32個の x0 から x31 と定義してあり, それぞれの番号のなかには特殊な役割をもっているレジスタもあります. 例えば, x0 は zero を表すレジスタと決まっている等です. そこで, 同じく量子レジスタも q0 から q31 の32個ある仕様として進めます. また, q0 は qzero を表すレジスタとし, ほかにも今後必要に応じて, 量子レジスタの役割も決めていきます. 量子レジスタは, 命令が呼ばれる前後で量子状態が保持される “保存レジスタ” としておきます.
量子命令セット
さて, 本題の量子拡張の命令セットを考えます. 量子計算では「1量子ビットのユニタリ演算」「2量子ビットのユニタリ演算」「量子ビットの射影測定」「量子ビットの初期化」「レジスタ間の移動」を追加することを検討することになります. ここでは, フォルトトレラントな(エラー訂正後の)量子計算を対象とすることにします. すると, 1量子ビット演算は少なくとも「Hadamard演算(Hゲート)」「π/8演算(Tゲート)」があればよく, 2量子ビット演算は「CNOT演算(CXゲート)」があれば, 万能量子計算として足ります. このエラー訂正後の量子計算モデルを対象にしていることは重要で, 最低限の個数の命令セットが定義されていればよいというスタンスです. つまり, 1量子ビット演算では, 任意角の回転ゲートなどはプリミティブな命令セットとしては準備しないということを意味します.
そこで, RISC-Vには custom0 〜 custom3 (opcode では, custom0 = 0xb, custom1 = 0x2b, custom2 = 0x5b, custom3 = 0x7b が割り当てられています)までの 4つの拡張命令が予め定義されていますが, エラー訂正後の量子計算を前提としたことにより, 量子命令セットで表現する内容がシンプルになるため「K extension」は, custom0 の定義域を使えば十分な設計にできます. すなわち, 量子拡張「K extension」は, カスタム命令セット領域(custom0)を使って定義します. custom0領域で再定義される量子命令セットは, フォーマット custom0_rs1_rs2 の R形式とするのが良いようです.
riscv-tools/riscv-opcodes/opecodes に次のような定義を追加します. 1量子ビット演算は, 必要最低限なHゲート, Tゲートだけではなく, X, Z, SゲートやT, Sの共役演算ゲートを利便性を高めるために定義します.
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†-gate
qoosdg.k rd rs1 rs2 qimm6 31=0 14..12=2 6..2=0x02 1..0=3 # quantum one-qubit operator S†-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(≠q0) | 000 | rd | 0001011 |
量子レジスタの1量子ビットの初期化(qtelep.k)
qtelep.k の特殊な利用として量子レジスタの初期化を定義します.
量子レジスタ 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* | opecode |
001 | T† | qootdg.k |
010 | S† | 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( ≠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 |
1 | qimm6 | rs2 | rs1 | Unitary* | rd | 0001011 |
14..12 | Unitary* | opecode |
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(≠ q0) | rs1 | 000 | rd | 0001011 |
以上が RISC-V K Extension の定義となります. この仕様を元にして, 量子シミュレーターや量子コンパイラ, 量子ファームウェアを開発しております.
1件の返信
[…] ・RISC-V Quantum Extension・QuESTをRISC-V上で動かす […]