2025-01-12

HiFive Premier P550を手に入れた

SiFive P550というコア使ったHiFive Premiver P550というボードを入手した。メモリ16GBが日本円で約60000円強。前買ったUnmatchedはドルだと$250高かったけど、円的にはそんなに変わらず。円安...

Install Ubuntu to SSD

確かまだPremier P550対応のDTSなどLinuxのコードはメインラインには入ってないけど、eMMCにはUbuntu 24.04 TLSがプレインストールされていてシリアルコンソール経由でログインすることが出来るが、SATAポートがこのボードに存在しているので、SSDにインストールすることにする

イメージを取得

https://github.com/sifive/hifive-premier-p550-ubuntu/releases/tag/2024.11.00にUbuntuのイメージが置かれているので、これを入手する

ディスクに書き込む

まずxzで圧縮されているので、展開

xz -d ubuntu-24.04-preinstalled-server-riscv64.img.xz

SSDが/dev/sdaだとして、ddコマンドでディスクに書き込む

dd if=ubuntu-24.04-preinstalled-server-riscv64.img of=/dev/sda bs=1M

この状態でリブートするとSSDが(hd0)になるので、SSD経由でブートする。ただし、eMMCはこのイメージを書き込んであるっぽいので、GPTのUUIDが全部一緒になるので、好みにおおじてGPTを変えてupdate-grubかけたほうがよい

Unix Bench

------------------------------------------------------------------------
Benchmark Run: Sun Jan 12 2025 06:34:27 - 07:02:47
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       12927124.9 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     2641.1 MWIPS (9.9 s, 7 samples)
Execl Throughput                               1176.6 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        229490.7 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           72809.9 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        374429.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                              475331.9 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  31965.9 lps   (10.0 s, 7 samples)
Process Creation                               2703.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   3510.5 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1154.5 lpm   (60.0 s, 2 samples)
System Call Overhead                         590916.1 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   12927124.9   1107.7
Double-Precision Whetstone                       55.0       2641.1    480.2
Execl Throughput                                 43.0       1176.6    273.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     229490.7    579.5
File Copy 256 bufsize 500 maxblocks            1655.0      72809.9    439.9
File Copy 4096 bufsize 8000 maxblocks          5800.0     374429.0    645.6
Pipe Throughput                               12440.0     475331.9    382.1
Pipe-based Context Switching                   4000.0      31965.9     79.9
Process Creation                                126.0       2703.0    214.5
Shell Scripts (1 concurrent)                     42.4       3510.5    828.0
Shell Scripts (8 concurrent)                      6.0       1154.5   1924.2
System Call Overhead                          15000.0     590916.1    393.9
                                                                   ========
System Benchmarks Index Score                                         463.6

------------------------------------------------------------------------
Benchmark Run: Sun Jan 12 2025 07:02:47 - 07:31:09
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       51689178.8 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    10560.7 MWIPS (9.9 s, 7 samples)
Execl Throughput                               4324.4 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        758792.3 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          282576.0 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1383510.8 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1893625.3 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 218013.6 lps   (10.0 s, 7 samples)
Process Creation                               9020.4 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   9097.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1184.8 lpm   (60.1 s, 2 samples)
System Call Overhead                        2362850.1 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   51689178.8   4429.2
Double-Precision Whetstone                       55.0      10560.7   1920.1
Execl Throughput                                 43.0       4324.4   1005.7
File Copy 1024 bufsize 2000 maxblocks          3960.0     758792.3   1916.1
File Copy 256 bufsize 500 maxblocks            1655.0     282576.0   1707.4
File Copy 4096 bufsize 8000 maxblocks          5800.0    1383510.8   2385.4
Pipe Throughput                               12440.0    1893625.3   1522.2
Pipe-based Context Switching                   4000.0     218013.6    545.0
Process Creation                                126.0       9020.4    715.9
Shell Scripts (1 concurrent)                     42.4       9097.3   2145.6
Shell Scripts (8 concurrent)                      6.0       1184.8   1974.6
System Call Overhead                          15000.0    2362850.1   1575.2
                                                                   ========
System Benchmarks Index Score                                        1591.8

大体Unmatchedの2倍くらいの速度

2025-01-10

2024年に買ったもの

買ったものを書いているけど、これ以外には、家 (賃貸) のトレイが壊れたため、結果として新しいトイレのユニットに入れ替わった (元のトイレは25年前のもの)。今どきトイレは水の使用量が少なくなっていたりするけど、そもそもシャワートイレにしないところが、大家...とは思ったが

Google Pixel 8a

これをメイン機にして、いままで使っていたPixel 6aをテスト機に格下げしました。前までの手頃値段感はなくなったけど継続して買っている。個人的にPixel買っている理由は、Androidのアップデートが長期的に行われそうなところ、aシリーズであれば手頃な値段に落ち着いていることと、万一画面が割れたとしても、iCrackedで当日持ち帰りの修理が可能なところ (Googleでの修理扱いになる) なだけで、これを満たしているのであればどれでもいいんだが

Panasonic 食器洗い乾燥機 SOLOTA NP-TML1

5月に購入。食洗機があると生活が変わるという記事を見たりするのだけど、ふと買ってしまった。確かに便利だし、寝る前に洗い忘れて、朝マグカップを洗うなんてことは日常だったので、生活はより楽にはなった。ただこの食洗機のレビューにいつも書いてあることだけど、これが受け入れられるかどうかで評価が変わる

  • 洗浄、乾燥で合計2時間かかる
  • 大きさが用途に合わないと、使い物にならない

ただ台数は売れないだろうから、ずっと同じものを5年以上売るんだろうね (Panasonicのロボット掃除機みたく)

象印 オーブンレンジ EVERINO ES-GW26

10月に購入。元々持っていたオーブンレンジ (三菱電機製) は20年以上使っていたしまったく壊れる気配がなかったのだが、新しいものが欲しくなって購入。今どきの電子レンジってこんなに機能豊富なんだなと改めて感動。スチームオーブンと迷ったけど、十分満足

デロンギ コーヒーグラインダー KG79J

12月に購入。コーヒー自体はドルチェグストを使っているのだけど、種類に飽きてきてコーヒー豆を買ってきたくなったのでミルを購入。価格も手頃だし、機能自体は挽く粗さを選べたり満足なのだが掃除が超面倒。メンテンス性が悪いという評判は見てたのだけど、これがね...

2025-01-07

RISC-VにおけるCrypto命令 (Crypto Extension)

やっとこさVector Extensionも1.0になり、そろそろいろんなExtensionを実装したSoCも出てくるとは思うけど、年末の移動時間のなかでいろいろ現在のCrypto Extensionを勉強してた

Crypto ExtensioもScalar命令版とVector命令版の2つがあって、Scalar版は組み込みとか用途向けの、レジスタとかを増やしたくない実装用で、Vectorはその名の通りVectorレジスタを使ったもの。試しにAESのEncryptionを実装してみる

Scalar版

Scalar版は以下のようになる。

void
riscv64zkn_aes_encrypt_block_128(uint64_t* expandedKey,
                                 uint8_t *output,
                                 const uint8_t *input)
{
  uint64_t state0 = *((uint64_t *)input);
  uint64_t state1 = *((uint64_t *)(input + 8));

  // Add round key 0 to initial state
  state0 = state0 ^ *expandedKey++;
  state1 = state1 ^ *expandedKey++;

  for (int i = 1; i < 10; r++) {
    uint64_t c0 = __riscv_aes64esm(state0, state1);
    uint64_t c1 = __riscv_aes64esm(state1, state0);
    state0 = c0 ^ *expandedKey++;
    state1 = c1 ^ *expandedKey++;
  }

  // Final round
  uint64_t c0 = __riscv_aes64es(state0, state1);
  uint64_t c1 = __riscv_aes64es(state1, state0);
  state0 = c0 ^ *expandedKey++;
  state1 = c1 ^ *expandedKey;

  *((uint64_t *)output) = state0;
  *((uint64_t *)(output + 8)) = state1;
}

Vector版

Vector版。まだVector Crypto ExtensionのIntrinics命令はStableじゃないので、インラインアセンブラ使ってる。

static vuint32m4_t
vaesz_vs(vuint32m4_t rd, vuint32m4_t vs2)
{
  __asm__("vaesz.vs %0, %1" : "+vr"(rd) : "vr"(vs2));
  return rd;
}

static vuint32m4_t
vaesem_vs(vuint32m4_t rd, vuint32m4_t vs2)
{
  __asm__("vaesem.vs %0, %1" : "+vr"(rd) : "vr"(vs2));
  return rd;
}

static vuint32m4_t
vaesef_vs(vuint32m4_t rd, vuint32m4_t vs2)
{
  __asm__("vaesef.vs %0, %1" : "+vr"(rd) : "vr"(vs2));
  return rd;
}

SECStatus
riscv64zvkn_aes_encrypt_block_128(uint32_t* expandedKey,
                                  uint8_t *output,
                                  const uint8_t *input)
{
  size_t vl = __riscv_vsetvl_e32m4(4);
  vuint32m4_t state = __riscv_vle32_v_u32m4((const uint32_t *)input, vl);

  // Add round key 0 to initial state
  vuint32m4_t K = __riscv_vle32_v_u32m4(expandedKey, vl);
  expandedKey += 4;
  state = vaesz_vs(state, K);

  for (int i = 1; i < 10; r++) {
    K = __riscv_vle32_v_u32m4(expandedKey, vl);
    expandedKey += 4;
    state = vaesem_vs(state, K);
  }

  // Final round
  K = __riscv_vle32_v_u32m4(expandedKey, vl);
  state = vaesef_vs(state, K);
  __riscv_vse32_v_u32m4((uint32_t *)output, state, vl);
}

Conclusion

  • RISC-Vの場合Load/Restoreをまとめないとvlenの長さを指定するvsetvliが大量に利用することになるので、速さに直結するかもということと、コンパイラ (gcc、LLVM) の最適化もまだまだっぽい
  • 両方ともx86のAES-NIに似た感じなので、AES-NIの経験値があれば、難しくないかも