QuESTをRISC-V上で動かす

quantum computing

QuESTをRISC-V上で動かす

QuESTはゲート型量子コンピュータ向けのシュミレータで、C言語で記述されていて、シンプルな記述で量子ビットの制御をシュミレーションしてくれる。自分的にQuESTの面白いのが演算をCPUだけではなく、GPUでも処理することができるように分かれていることだ。

ざっと調べてみたところ、多くのシュミレーターは演算をCPU or GPUで処理するようになっていて、GPUについては殆どのケースでCUDAが使われている。中にはOpenCLを使ったQrackのような物もある。QrackはOpenCLで行列の演算を行うため、NVIDIAに限らずIntel/AMDといったOpenCLが動作する環境でも利用できる。QuESTもGPUに流す先はCUDAになっている。

今回の我々のプロジェクトではシュミレーションにRISC-Vを利用する。実際はカスタム命令セット、量子用のレジスタを追加して使うことになるのだが、QuESTをRISC-V上で動作させてみることにする。

というのも、RISC-Vはメニーコアで数百〜千のコアで並列処理を行うことができる環境も発表されてきている。esperantoの4Kメニーコアは一時期話題にもなった。ゲート型のシュミレーション環境として、GPU(CUDA/OpenCL)のような大量のコアで動作する環境のターゲットとして、RISC-Vメニーコア上で動作させることができれば、シュミレーション環境のひとつとしてRISC-Vプラットフォームを活用することが出来るようになるというわけだ。

環境としては前回作成したRISC-Vエミュレーター環境(spike)を利用する。spikeには-pオプションでプロセッサの数をシュミレーションすることが出来る。デフォルトは1コアだが、1000コア上で動作させてみる。

git clone https://github.com/QuEST-Kit/QuEST
cd QuEST

# RISC toolchainでビルド出来るようパッチを当てる
wget https://quantum.siprop.org/wp-content/uploads/2019/07/diff.patch_.zip
unzip diff.patch_.zip
patch -p1 < diff.patch

# QuESTをビルドして実行
mkdir build
cd build
cmake ..
make 
# 1000コア上で動作させる
spike -p1000 --isa=rv32i pk demo
bbl loader
-------------------------------------------------------
Running QuEST tutorial:
	 Basic circuit involving a system of 3 qubits.
-------------------------------------------------------

This is our environment:
QUBITS:
Number of qubits is 3.
Number of amps is 8.
Number of amps per rank is 8.
EXECUTION ENVIRONMENT:
Running locally on one node
Number of ranks is 1
OpenMP disabled
Precision: size of qreal is 8 bytes

Circuit output:
Probability amplitude of |111>: 0.498751
Probability of qubit 2 being in state 1: 0.749178
Qubit 0 was measured in state 1
Qubit 2 collapsed to 1 with probability 0.998752

これは単にRISC-V向けにビルドして1000コア上で動作させただけ、といった感じだがメニーコアを生かした実装をQuEST/src/CPU, GPUの他にもRISC用のディレクトリを作って実装を入れていけば、RISC-Vメニーコアを生かしたシュミレーション環境を作ることも出来るだろう。

2件の返信

  1. […] Spikeへの量子系の命令セットを追加する前に少し考えることが出てきました。1. エミュレーター起動時に量子ビット数を与えられるようにする2. エミュレーター内に量子レジスタという定義を行って、量子レジスタを使った演算を行えるようにするといったものです。1については非常に簡単で、エミュレーターの起動時の引数に加えることでOKです。例えば次のような感じで。spike -q[num] pk testといった感じで、numが量子ビット数を与えてプログラムをエミュレーター上で動かします。2については悩んだ結果、調査段階で検討していたQuESTをスタティックリンクでSpikeと結合することによって、Spike内の量子レジスタの操作(hadamard/measure)を行えるようにすることにしました。ということで、– QuESTをstatic link libraryとしてビルドできるように改造– SpikeのビルドでQuESTを読み込ませて動作させるといった実装を行います。Spike内ではprocessor.h, processor.cc内に次のような実装が入ることになります。 […]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です