RISC-V 量子拡張 (2. カスタム拡張を考える[続き])

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

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

custom0(opecode = 0xb) := 今は定義することを考えないで空けておきます. (今後の検討で必要になるかもしれません. )
custom1(opecode = 0x2b) := 1量子ビット・ユニタリ演算
custom2(opecode = 0x5b) := 2量子ビット・ユニタリ演算
custom3(opecode = 0x7b) := 量子ビットの射影測定

とおきます. そして, 1量子ビット・ユニタリ演算は custom1_rs1, 2量子ビット・ユニタリ演算は custom2_rs1_rs2, 量子ビット射影測定は custom3_rs1_rs2 (rs2は古典レジスタ)で表せると仮定します. ほかに「量子ビットの初期化」「レジスタ間の移動」が必要ですが, 古典命令セットを流用できそうです.

というところまでは既に検討したところです.

なお, 量子拡張を表す識別文字を検討した際に,

量子を示すのに都合がよさそうなQuantumの頭文字「Q」は「4倍浮動小数点」として予約されていますので使えません. 
そこで量子計算に欠かせない「ユニタリ」を表す「U」の記号を当てるのが良さそうです. 量子計算拡張は「U」として提案しましょう. 

としていたのですが, qemu のソースコードを確認したところ, 「U」は user-level として特権モードかどうかの識別文字として使われていることが分かりました. ( user-level 「U」に対して, supervisor-level の「S」です. )
それを除くと使われていない識別文字は, G, K, O, R, W, X, Y, Z です. この中で量子っぽい文字を割付けたいのですが, 適当な文字があまりありません. 苦しまぎれに, 「K」はどうかと考えています. ロシア語圏などでは, “quantum” を “kvant” と記すようです.

さて, 具体的な量子命令セットを定義していきましょう.

詳細を検討してみると拡張セットの定義領域は思いのほか広く, custom0 だけで全ての量子命令セットが表現できる可能性がでてきました.
そこで, 以前に検討した方針を全面的に見直します. また, 「量子ビットの初期化」「レジスタ間の移動」は量子命令セットを独自で定義します.

再定義の量子命令セットは, フォーマット custom0_rs1_rs2 の R形式とするのが良いようです.

  • 量子ビット間の移動

量子レジスタ rs1 の shmat で指定された量子ビットの状態を, 量子レジスタ rs2 の shamt で指定された量子ビットに量子テレポーテーションします.

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

量子レジスタ rs2 の shmat で指定された量子ビットの状態を初期化します.

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

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

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 shamt rs2(=q0) rs1 Unitary rd 0001011
14 .. 12 Unitary
110 T
111 H
  • 2量子ビット演算

量子レジスタ rs1 の shamt[control] で指定したビット位置を制御ビット, 量子レジスタ rs2 の shamt[target] で指定したビット位置を操作ビットとして 2量子ビットの Control Unitary を作用する命令です.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 shamt[control] rs2 rs1 Unitary shamt[target] 0001011
14 .. 12 Unitary
011 CNOT
  • 1量子ビットの測定

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

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
1 shamt rs2(=q0) rs1 000 rd 0001011
  • 複数量子ビットの測定

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

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