RISC-V 命令セットの安価なシングルボードコンピュータ (SBC) のPerfXLab RVBoards-Nezha を入手したので使ってみた際の備忘録。
RISC-V 命令セットは、MIPSやSPARCの「改めて考えるとあまり良いアイデアではなかった」みたいな部分を全面的に見直した設計になっている。 象徴的なのは、遅延分岐とレジスタウインドウがなくて、TLBミスの際のページテーブル探索はハードウェア側でやるようになっている。 とはいえ、命令セットや設計が整然としていることと、製品としてのCPUの性能が高いことに相関がないというのは、もはや常識となったと言っても良い。 RISC-Vはロイヤリティフリーというところで勝負に出ていて、ASICとしていくつかの実装も出回り始めてきている。
そういう状況で、評価ボードの類がいくつか利用可能になってきていた。 Linux が動くようなものとして有名なものだと、RISC-V関連の有力企業SiFive のSiFive Unleashed, SiFive Unmatched がある。 これらのボードはUSD 1,000 前後の価格帯で、クラウドファンディングサイトでの受注生産のみなのか、通常のルートで購入することができない状況が続いていた。
RVBoards-Nezha は、北京のPerfXLab (澎峰科技) が開発したRISC-V版Raspberry Pi とでもいうべきボードで、いつもの通販サイトAliexpress でUSD 100 前後で購入できた。
CPUはAllwinner D1 というシングルコアのチップで、1 GHz で動作するRV64GCV 命令セットのT-Head C906 CPUを搭載している。
V
– Vector Extension 対応を謳っているが、まだ仕様が固まっていないのではないかという疑問はある。
ちなみに、Nezha (哪吒)は中国の神話の登場人物らしい。
T-Head はAlibaba Group の企業で、Alibabaが買収したC-Sky のCPU開発チームと関連がありそう。 T-Head が提供しているRV64 命令セットのCPUとして、C906は5-stage のインオーダーの設計で、一番小さい規模のものだ。
外箱は白くてRISC-V, RVBoards, 澎峰科技のロゴがそれぞれ入っていた。
その中には、ボードがすっぽり入る大きさの黒い箱と、デバッグケーブルや電源アダプタなどが入っていた。
黒い箱は詩みたいなのが書いてあってかっこいい。


ボードの部品はRaspberry Pi に似た配置になっている。
無線LAN/Bluetooth やGigabit Ethernet がついているのが便利。
DRAMはDDR3 が合計 1 GByte。



起動コンソールはデバッグポートから出てきていた。 デバッグポートはGPIO側からGND, RX, TX となっていて、添付されていたUSB-TTLシリアルケーブルならそれぞれ黒、緑、白の順にケーブルを繋ぐ必要がある。 115200 ボーで出力されていた。
データシート、回路図などの情報は [linux-sunxi.org] にまとまっている。
charがunsigned charCのプログラムにおいて、x86 ではcharが-128から127の値域をもつsigned charなのに対し、RISC-Vではcharは0から255の値域のunsigned charになる。
この挙動はRISC-Vとarmとで同じだが、アーキテクチャの名前で切り分けていたりするプログラムだと不具合につながることがある。
Debian 13 (Trixie) 以降そのまま利用可能。 Debianインストール方法に書いた。
FreeBSD 15.0-RELEASE は動作した。 FreeBSD だとこのボードのようにメモリ 1 GB でも軽快に動くので、最近の肥大化したLinux を無理して使うより快適かもしれない。 動かすまでに少し手順が必要だったので別ページにて。
Nezha はOpenBSD/riscv64 のSupported hardwareに掲載されている。 こちらはまだ試していない。
Ubuntu 25.04まで使用可能。 Ubuntu情報に記載。
古い情報なのでページを分けた。 添付のDebianの使用情報。
Nezha に搭載されるC906 CPUコアは、マイクロアーキテクチャに関する資料が中文で公開されている [1]。 実際にどういう実装になっているのか調べるために性能測定を行った。 比較対象として、代表的なSBC Raspberry Pi 3B を用いる。 Raspberry Pi 3B は4コアの1.2 GHzで動作するCortex-A53 を搭載しているが、1 GHzで動作するNezha のC906 CPUコアと比較しやすくするため、1.0 GHz にアンダークロックして計測した。 Cortex-A53はdual-issue のスーパスカラだ。 以下のベンチマークはすべてシングルスレッドで動作する。
SPEC CPU2000のCINT2000 は、いわゆる整数系のベンチマーク集だ。
想定されるとおり、single-issueのC906 は、dual-issueのCortex-A53 と比較して半分の性能となった。
SPEC CFP2000 は浮動小数点数の計算を含むベンチマーク集だ。
こちらは、Cortex-A53 でも浮動小数点の演算器は一つしかないので、FPU命令の実行時の頻度が高いワークロードほど、C906 と同じような性能になっていることが観察できる。
-O3 -march=rv64gcv.-O3 -mcpu=cortex-a53.
Underclocked to 1 GHz with command echo 1000000 > /sys/devices/system/cpu/cpu[0-3]/cpufreq/scaling_max_freq.
C906 はT-Head Instruction Extension (平头哥扩展指令集)に対応している。 この拡張命令セットは以下の機能がある。
NOPみたいな機能)Nezha のオンボードのEthernet インターフェースは1000 Mbps のGigabit Ethernet対応だ。 この性能を簡単に測定した。
検証に使用したOS はNezha 側がUbuntu 25.04 (Linux 6.8.0-31-generic) iperf3 3.18, 対向がIntel Gigabit CT Desktop Adapter/OpenSUSE Tumbleweed (Linux 6.14.4-1-default) iperf3 3.18だ。 この2つをUTP ケーブルで直結して、IPv6 のlink-local アドレスで通信を行っている。
デフォルトのMTU 1500 だと、Nezha宛に送るだけの場合で 430 Mbits/sくらいでNezha 側のCPUでiperf3 80%, ksoftirqd 18% くらいで頭打ちになった。
Nezha発の送信のみにすると、iperf3 が95% くらいCPU を使って340 Mbits/s くらいに。
iperf3 に--bidirをつけると、Nezha宛が235 Mbits/s, Nezha発が149 Mbits/sくらいでiperf3 85%, ksoftirqd 12%くらいの感じで頭打ちに。
ksoftirqdが活躍していることから考えて、MTU を大きくすれば割り込み頻度を下げられてもう少しスループットは出そうなのだが、どうやらNezha のNIC では最大MTU が1500 前後のようだ:
% ip link set dev end0 mtu 9000 Error: mtu greater than device maximum.
Fast Ethernet よりは性能は出るものの、CPUがボトルネックになることでGigabit Ethernet のワイヤーレートが出せるわけではないので注意が必要。