docker container for RISC-V quantum extension.
未踏の成果のひとつでもある、コンパイル・エミュレータ環境をまとめたdocker containerを用意した。
■ specs
URL : https://hub.docker.com/u/siprop
OS : Ubuntu 18.04
gcc(RISC-V) 8.3.0
LLVM 11.0.0
RISC-V Spike emulator 1.0.0-dev
■ RISC-V GCC Toolchain quantum extension.
source code : /root/work/riscv-gnu-toolchain
■ RISC-V emulator quantum extension.
source code : /root/work/riscv-tools/riscv-isa-sim
test code :
cd /root/work/riscv-tools/riscv-isa-sim/tests
make qfunc
spike -q2 -r4 pk test_qfunc
■ LLVM for RISC-V
source code : /root/work/riscv-llvm
■ qlang(quantum language with LLVM reference implements)
source code : /root/work/qlang
test code :
cd /root/work/qlang
make run-riscv
make qopt-run
RISC-V 量子拡張の参照実装とマイクロ波制御量子ファームウェアの開発 に資料がある。ここの量子コンパイラ、量子プロセッサシュミレータの部分をまとめてdockerとして置いてある。テストコードはそれぞれのディレクト配下にあるので、makeすれば動作させることが出来る。
簡単に説明すると、量子向けのコンパイラとしてgcc toolchainに量子向けの拡張を行って、アセンブリ形式で量子向けの命令を記述できるようにしている。さらにLLVMプラットフォームでもビルド出来るため(バックエンドはgcc toolchainにすることで)、LLVMを使った独自言語としてqlangを開発した。そしてRISC-V量子拡張命令セットを追加したエミュレータを実行環境として動作させている。
つまり…gcc、LLVM、qlangのどれでコンパイルしても大丈夫という構成を取ることが出来ている。もしLLVM上で他の言語、例えばRustとかでも同じ仕様でバックエンドgcc toolchainとの繋ぎをすれば、フロントエンドの高水準言語については何を使ってもOKということになる。
構造としては非常にシンプルで分かりやすいと思われ。
■ 色々やってみて分かった点
1. 量子演算シュミレーションはメモリを超大量に使う
これは地味に凹んだ。複素確率振幅に対する行列演算をする訳だけど、量子ビット数が増えるほどめちゃくちゃ大量のメモリが必要になってくる。QuESTの実装だとデフォルトで、(1 << 量子ビット数) x sizeof(float) x 2 ものメモリを必要としている。つまり…
8qbit : 2kbyte
16qbit : 512Kbyte
32qbit : 32Gbyte
48qbit : 2Pbyte
これはキツイ。ということで、ビット数はシュミレーションということで抑えることに。
2. RISC-Vエミュレータの改造
最初はQEMUを使おうとしたけど、RISC-V Toolsに謹製のSpikeシュミレーターを発見した。このシュミレータは命令セットの拡張・追加も簡単で、複数プロセッサもシュミレーションしてくれたり何気に多機能で使いでがあると思われ。Spikeに新しい命令セットを追加してRISC-V量子プロセッサーとして使うのはわりとサクッとできた。
3. gccの改造
gcc toolchainに改造を加えたわけだけど、みんな大好きgccの内部構造の説明とかあんまり無いのよね。命令セットを追加する時はここ見なよとか、まぁあるはずも無い。ということで、コードをひたすら追って改造をした。全体がかなりデカイけど、まぁ読めばなんとかなるですな。
4. LLVMのビルド
いわゆるclang。Swift/Rust…etc 色んな所で使われているLLVMなわけだけど、このフルビルドは全くもってオススメできない。
CPUとメモリ(16Gbyteくらいあれば良いかも)を大量に使って、ビルドも1時間位はみておく必要がある。gccは同程度でも30分くらいで終わって差分ビルドでサクサク開発できるけど、LLVMはマジでデカイ。
これでサクサク短期間で開発するというのは不可能に近いから、LLVMに命令セットを直接追記するのは諦めることにして、フロントエンドの高水準言語として新しくqlangという物を作ることにした。
5. 独自言語(qlang)の開発
LLVMを使った独自言語はわりと沢山ある。今回使っているのは最新の11.0.0ということで…これまた資料は本家のドキュメントかコードを読むのみ。まぁ、これも読んでググって使ってみて、といういつもの流れでOKだった。とてもエレガントで美しいC++で出来ていて、読み応えがあった。
6. 最適化実装
1qbitに対するX・Y・Zゲートが連続すると360度回ってきて、恒等変換で打ち消して無かったことに出来る。このように連続したX・Y・Zゲートがソースコード上にあるとき(qlang、gcc assembly)、その処理を消すという最適化の実装をLLVM上で行った。
このLLVMの最適化を実装するにあたって、LLVMのPass・最適化を行う構造を調べたりした。gccの最適化実装の方はサッパリ調べていないけど、LLVMのPassの構造はとても綺麗で、もし自前の言語や独自最適化で高速化を目指すなら、LLVM Passは超オススメな感じ。
一通り、命令セット〜GCC〜LLVM〜言語開発まで足回りから一番上の層まで使って開発できたのは何気に面白い感じではあった。まぁ…触って使ってみれば何とかなるもので、Quantum Programmingに関連する技術・今回使ったものも非常に多様で奥が深かった。どの層も作ってみれば、わりと面白いと思われ。
ニュースでよく流れる、量子コンピュータが公開鍵暗号を破るぞ!!というのに踊らされることなく、実際に触って使ってみるとわりと面白いと思われ。