RISC-V spike vs QuEST
RISC-V SpikeのエミュレーターにはQuESTを組み込んで、量子系の命令セットをカスタムとして用意した。そこで気になるのが、QuEST(on x86)で普通に書いたプログラムとRISC-V Spike with QuESTを通して動かしたとき、どっちが早いのか?という単純な疑問になる。
単純に考えると、どっちも終端しているのはQuESTなんだし結果は一緒では?と思うかも知れない。いくらRISC-V ISAで動作するQuESTとx86上で動作するといっても…それほど違わないだろうと。自分もやってみるまでそうだった。ただ、実際の結果は全く違うものになった。
■ 環境とソースコード
- 環境
VirtualBox 6.0.12 on Windows 10
OS : Ubuntu 18.04
CPU : 6vcpu(Intel Core i7-8750, 2.2GHz)
MEM : 16Gbyte(DDR4 2400MHz)
HD : 512GB PCIe M.2 SSD
#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int ret1 = 0; int i = 0; // call qooh for (i = 0; i < 10000000; i++) { asm volatile( "qooh.k qa0,qt1,qzero,1;" "qmeas.k %0,qt1,qzero,1;" :"=r"(ret1) : ); } printf("%d\n", ret1); return 0; }- QuEST source code.
#include <stdio.h> #include "QuEST.h" int main (int narg, char *varg[]) { QuESTEnv env = createQuESTEnv(); Qureg qubits = createQureg(4, env); initZeroState(qubits); for (int i = 0; i < 10000000; i++) { hadamard(qubits, 0); int outcome = measure(qubits, 0); } destroyQureg(qubits, env); destroyQuESTEnv(env); return 0; }
以上の環境で計測してみる。マシン環境はVirtualBox上のUbuntuで至って普通のマシン環境になる。量子側のコードは4qbit、hadamardして計測を1000万回繰り返すだけのこちらもシンプルな処理になる。
■ 計測結果
それぞれプログラムを10回実行したときの値は以下の通り。単位は秒で。
Spike | QuEST | |
1 | 4.632 | 46.638 |
2 | 4.538 | 45.148 |
3 | 4.589 | 44.374 |
4 | 4.788 | 45.510 |
5 | 4.867 | 44.584 |
6 | 4.478 | 45.333 |
7 | 4.418 | 44.209 |
8 | 4.458 | 44.406 |
9 | 4.456 | 44.755 |
10 | 4.456 | 44.572 |
avg | 4.568 | 44.952 |
■ 考察
なぜ、このような結果になったのか?RISC-V Spikeエミュレーターに搭載したQuESTの方が10倍も高速に動作するという結果になった。
いくらISAの違いといってもこの差はさすがに無いだろう...ということで、この原因について考えてみたところ、それぞれの動作の違いが大きい。これはプログラムを動かしているときの統計情報を見てみると分かりやすい。
■ Quest 動作状況
CPU負荷CPU %user %nice %system %iowait %steal %idle 06:50:17 PM all 0.64 0.00 0.00 0.00 0.00 99.36 06:50:18 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:19 PM all 99.33 0.00 0.67 0.00 0.00 0.00 06:50:20 PM all 99.00 0.00 1.00 0.00 0.00 0.00 06:50:21 PM all 99.00 0.00 1.00 0.00 0.00 0.00 06:50:22 PM all 99.67 0.00 0.33 0.00 0.00 0.00 06:50:23 PM all 99.67 0.00 0.33 0.00 0.00 0.00 06:50:24 PM all 99.33 0.00 0.50 0.00 0.00 0.17 06:50:25 PM all 99.16 0.00 0.50 0.00 0.00 0.34 06:50:26 PM all 98.84 0.00 1.16 0.00 0.00 0.00 06:50:27 PM all 100.00 0.00 0.00 0.00 0.00 0.00 06:50:28 PM all 99.00 0.00 0.50 0.00 0.00 0.50 06:50:29 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:30 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:31 PM all 99.50 0.00 0.33 0.00 0.00 0.17 06:50:32 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:33 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:34 PM all 99.33 0.00 0.67 0.00 0.00 0.00 06:50:35 PM all 99.00 0.00 1.00 0.00 0.00 0.00 06:50:36 PM all 99.17 0.00 0.83 0.00 0.00 0.00 06:50:37 PM all 99.00 0.00 1.00 0.00 0.00 0.00 06:50:38 PM all 98.82 0.00 1.01 0.00 0.00 0.17 06:50:39 PM all 98.32 0.00 0.67 0.00 0.00 1.01 06:50:40 PM all 99.33 0.00 0.67 0.00 0.00 0.00 06:50:41 PM all 99.33 0.00 0.50 0.00 0.00 0.17 06:50:42 PM all 98.66 0.00 1.34 0.00 0.00 0.00 06:50:43 PM all 99.33 0.00 0.50 0.00 0.00 0.17 06:50:44 PM all 98.50 0.00 1.17 0.00 0.00 0.33 06:50:45 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:46 PM all 99.33 0.00 0.67 0.00 0.00 0.00 06:50:47 PM all 99.67 0.00 0.33 0.00 0.00 0.00 06:50:48 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:49 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:50 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:51 PM all 99.67 0.00 0.33 0.00 0.00 0.00 06:50:52 PM all 99.33 0.00 0.67 0.00 0.00 0.00 06:50:53 PM all 99.33 0.00 0.67 0.00 0.00 0.00 06:50:54 PM all 99.67 0.00 0.33 0.00 0.00 0.00 06:50:55 PM all 99.50 0.00 0.50 0.00 0.00 0.00 06:50:56 PM all 99.33 0.00 0.67 0.00 0.00 0.00 06:50:57 PM all 99.00 0.00 1.00 0.00 0.00 0.00 06:50:58 PM all 99.00 0.00 0.83 0.00 0.00 0.17 06:50:59 PM all 99.67 0.00 0.33 0.00 0.00 0.00 06:51:00 PM all 98.49 0.00 1.18 0.00 0.00 0.34 06:51:01 PM all 53.83 0.00 0.33 0.00 0.00 45.83 06:51:02 PM all 0.00 0.00 0.00 0.00 0.00 100.00メモリ利用状況
kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 06:49:17 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:18 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:19 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:20 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:21 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:22 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:23 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:24 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:25 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:26 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:27 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:28 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:29 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:30 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:31 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:32 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:33 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:34 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:35 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:36 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:38 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:39 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:40 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:41 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:42 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:43 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:44 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:45 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:46 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:47 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:48 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:49 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:50 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:51 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:52 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:53 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:54 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:55 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:56 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:57 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:58 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:49:59 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:50:00 PM 14417472 15906772 2007632 12.22 216628 1441552 432404 2.11 1194476 519416 0 06:50:01 PM 14416672 15905972 2008432 12.23 216636 1441544 432404 2.11 1195456 519416 0 06:50:02 PM 14412824 15902200 2012280 12.25 216644 1441560 419328 2.05 1197688 519336 272 06:50:03 PM 14412980 15902356 2012124 12.25 216644 1441560 419328 2.05 1197588 519332 272 06:50:04 PM 14412980 15902356 2012124 12.25 216644 1441560 419328 2.05 1197588 519332 272 06:50:05 PM 14412980 15902356 2012124 12.25 216644 1441560 419328 2.05 1197588 519332 272 06:50:06 PM 14412948 15902324 2012156 12.25 216644 1441560 419328 2.05 1197588 519332 0 06:50:07 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 48 06:50:08 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 48 06:50:09 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 48 06:50:10 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 48 06:50:11 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 48 06:50:12 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 0 06:50:14 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 0 06:50:15 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 0 06:50:16 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 0 06:50:17 PM 14412808 15902184 2012296 12.25 216652 1441560 419328 2.05 1197944 519332 0 06:50:18 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:19 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:20 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:21 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:22 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:23 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:24 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:25 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:26 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:27 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:28 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:29 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:30 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:31 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:32 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:33 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:34 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:35 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:36 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:37 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:38 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:39 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:40 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:41 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:42 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:43 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:44 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:45 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:46 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:47 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:48 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:49 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:50 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:51 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:52 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:53 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:54 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:55 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:56 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:57 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:58 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:50:59 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:51:00 PM 14412808 15902184 2012296 12.25 216652 1441560 459672 2.25 1198084 519332 0 06:51:01 PM 14413004 15902380 2012100 12.25 216652 1441560 426492 2.09 1198084 519332 0 06:51:02 PM 14413056 15902432 2012048 12.25 216652 1441560 426492 2.09 1197912 519332 0
■ Spike動作状況
CPU負荷CPU %user %nice %system %iowait %steal %idle 06:58:17 PM all 8.50 0.00 0.17 0.00 0.00 91.33 06:58:18 PM all 16.56 0.00 0.00 0.00 0.00 83.44 06:58:20 PM all 16.69 0.00 0.00 0.00 0.00 83.31 06:58:21 PM all 16.78 0.00 0.00 0.00 0.00 83.22 06:58:22 PM all 14.10 0.00 0.17 0.00 0.00 85.74 06:58:23 PM all 0.00 0.00 0.00 0.00 0.00 100.00メモリ利用状況
kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 06:58:16 PM 14417320 15907024 2007784 12.22 216724 1441780 415376 2.03 1195372 518948 20 06:58:17 PM 14417320 15907024 2007784 12.22 216724 1441780 415376 2.03 1195372 518948 20 06:58:18 PM 14416064 15905768 2009040 12.23 216724 1441780 2518140 12.31 1196712 518948 20 06:58:19 PM 14416072 15905776 2009032 12.23 216724 1441780 2518140 12.31 1196712 518948 20 06:58:20 PM 14416072 15905776 2009032 12.23 216724 1441780 2518140 12.31 1196712 518948 20 06:58:21 PM 14416072 15905776 2009032 12.23 216724 1441780 2518140 12.31 1196712 518948 20 06:58:22 PM 14417052 15906756 2008052 12.23 216724 1441780 419560 2.05 1195536 518948 20 06:58:23 PM 14417052 15906756 2008052 12.23 216724 1441780 419560 2.05 1195536 518948 20
RISC-V Spikeの方はメモリを起動時に大量に確保して、CPUはあまり使わなくても良い。逆にQuEST単体の方はメモリをあまり利用しないで、CPUを大量に(6vCPU全て)使い切っている。
また、Spikeの方は起動時にエミュレーター上にメモリを確保するため、起動時に2Gbyteのメモリを確保してQuESTの処理が全てオンメモリで動作する。逆にQuEST単体の方は、処理中でも57Kbyte程度のメモリしか確保しないで動作している。つまりメモリについての扱いの差が如実に結果に反映されたと考えられる。
また結果として、今回実装したRISC-V Spike with QuESTの環境を利用すると、QuESTを利用した量子演算が10倍早く行えるということを意味している(うまく実装できて良かった)。
■ おまけ
折角なので手持ちのRISC-V 64bit dual core K210(400-600MHz)を搭載した、Sipeed Maix M1w DockでもQuESTを動作させてパフォーマンスを見ることにした。
ビルドにはPlatformIOを利用して、kendryte210 SDKを使ってビルドをする。ソースコードはここにPIOのプロジェクトをtar.gzで固めて置いてある。ソースコードの中身は上記の"QuEST source code."と一緒で動く。
実際に1000万回繰り返してみた結果は...7分14秒でした。
CNN向けアクセラレータ KPUの方に処理をオフロードしてあげれば、もしかして高速に動作するかもしれない。