コグノスケ


2022年 12月 7日

個人で自社製品 RISC-V CPU を買うことはできるか?その 5 - ボード到着、包装が……

目次: RISC-V - まとめリンク

ついに Akaria NS31A の Entry Kit の回路データが書き込まれた FPGA ボード(DIGILENT ARTY A7 ボード)が到着しました。やったー。

中身はボードとドキュメント類が書き込まれた DVD が入っているだけのシンプルなものです。受領書を返してくれと言われているのですが、返し方が良くわからないのでメールで質問中です。

DVD の中身はまた後日確認したいと思います。

包装

送られてきた荷物を見てビックリしたんですけど、ちょっと包装に問題がありました。自社商品でもあるし、せっかく拓いてもらった個人向け販売チャネルを潰したくないので、忖度全開で詳しいことは書きませんけども……。

私は細かいことは気にしないですが「さすがにこれはダメでしょ?〇〇社に怒られますよ?」と思ったレベルのミス、とだけ添えておきます。

編集者: すずき(更新: 2022年 12月 19日 16:27)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 12月 9日

個人で自社製品 RISC-V CPU を買うことはできるか?その 6 - 受領書と付属 DVD の謎

目次: RISC-V - まとめリンク

NS31A Entry Kit を受け取ったら受領書を送り返してほしい、と言われているのですが、受領書は不思議な書類で、

  • B2B 方式(納品書兼検査票、納品荷札、受領書の 3つ)のまま来た、何を送り返せば良いか?
  • 受領書の送付先に名古屋(私は東京在住)の住所が印字されている、おかしくないか?
  • 印鑑をつくところがたくさん(検査、受入、受領印)あるが、どれが必要なのか?
  • 受け渡し「場所」に私の個人名が印字されているが、これで正しいのか?

受領書に関係していそうな前者 2つについて質問したところ「あなたの住所を書いてくれ」という意味が分からん回答が返ってきました。質問の仕方が悪いのか、的の外し方から察するに「私に何を送ったか把握していない」可能性もありそうです。

  • メールのやり取りで「関係者」という単語が何度か出ていた → 窓口担当以外に、少なくとも発送担当が別に居る
  • 発送担当はいつもの相手(デンソーかなんか)と勘違いしていた
  • 窓口担当者は荷物をノーチェックで発送した

と推理すると包装の問題とか、個人向け販売なのに受領書が B2B 向け販売の仕様(検査票+受領票とセット)が少しは理解できます。

さておき質問を文章で説明するのは厳しそうなので、送られてきた書類をスキャンし赤い字で「ここですけど、どうしたら?」と書いて送ってみました。これならご理解いただけるはず。

中身が

付属していた DVD に書かれたデータも欠けていた(サンプルプログラムが入っていない)ので、問い合わせたら「内容が間違ってた、ごめん」的な返事とともに、後日 DVD がもう 1枚家に送られてきました。

個人向け販売チャネル第一号ってのはなかなか大変ですね。デバッグをしているような気分です。

編集者: すずき(更新: 2022年 12月 19日 16:27)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 12月 12日

自作 OS の紹介その 1 - 概要

目次: 独自 OS - まとめリンク

最近、趣味&趣味からの発展で仕事でも独自 OS を作成しています。OS と呼ぶほどの機能はありませんが、位置的には C ライブラリよりハード寄りのいわゆる OS レイヤーです(ソースコードへのリンク)。

目的、目標

想定する動作環境は、複数プロセッサで構成されたシステムにおいて、片方がホスト、もう片方がアクセラレータとして動作する環境です。想定する制御方法は、ホスト側で実行したくない、時間がかかる処理をアクセラレータ側に任せて終わるのを待つ、シンプルなユースケースで下記のようになります。


アクセラレータの制御方法

このようなシステムにおいて PC 系のプログラマが気軽にアクセラレータ側のソフトウェアを書ける環境が欲しい、という発想から、アクセラレータのプログラマの補助となるような OS の作成が目的です。

独自 OS の設計目標は下記の通りです。

  • できるだけ軽く、速くしたい
  • できるだけ便利、手軽にしたい
  • アクセラレータ向けに割り切る(汎用 OS は目指さない)

最初の 2つの項目は大抵トレードオフですが、3つ目の項目を活かして軽く&便利を両立させることが狙いです。

既存手法との違い

アクセラレータを動作させるという観点で見れば、わざわざ独自 OS を作成せずとも既存のアクセラレータ用言語を使ったり、既存 OS の転用でも動作させることができます。

既存のアクセラレータ用言語、CUDA や OpenCL ですね。速度は最高だと思います。プログラマ視点から見ると、これら言語の習得には若干手間が掛かります。

Linux など PC 系 OS を転用する場合、使い勝手は PC そのものなので最高でしょう。しかしアクセラレータ向けとしては大規模で大げさでもあり、ハードウェアのリソース特にメモリがかなり必要です。

RTOS を転用するの場合、省メモリかつ大抵の実装は速度も速いです。しかし目的が違う(リアルタイム処理を記述するための OS)ため、色々な OS 独自ルールが存在します。PC 系のプログラマには馴染みが薄いです。

手法速度メモリ手軽さ
アクセラレータ用言語×
PC 系 OS(Linux など)×
RTOS

独自 OS では使い慣れた C/C++ 言語が使えて、速さを殺さず、Linux の使い勝手を可能な限り両立させることを目指します。

編集者: すずき(更新: 2023年 1月 9日 04:59)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 12月 13日

独自 OS まとめリンク

目次: 独自 OS - まとめリンク

一覧が欲しくなったので作りました。

編集者: すずき(更新: 2023年 1月 9日 05:17)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 12月 14日

自作 OS の紹介その 2 - デザイン

目次: 独自 OS - まとめリンク

最近、趣味&趣味からの発展で仕事でも独自 OS を作成しています。独自 OS の設計目標は下記の通りです。

  • できるだけ軽く、速くしたい
  • できるだけ便利、手軽にしたい
  • アクセラレータ向けに割り切る(汎用 OS は目指さない)

最初の 2つの項目は大抵トレードオフですが、3つ目の項目を活かして軽く&便利を両立させることが狙いです。

アプローチ(アクセラレータ側)

「便利、手軽」の実現のため、ソースコードレベルの互換性の確保を目指します。具体的には Linux 用に書かれたソースコードをそのままアクセラレータ用にコンパイル&実行できれば、プログラマから見て Linux の使い勝手を実現できている、と言えるはずです。

一方で「軽く、速く」を実現するため、Linux とのソース互換を目指しつつも、アクセラレータ向けに割り切った制限をいくつか設けます。

単一バイナリを実行
ユースケースに由来する制約です。別の仕事をしたいときはアクセラレータで実行するバイナリを切り替えます。
プロセスは未対応(常に 1プロセス)
上記とほぼ同じ理由です。アクセラレータ上でマルチプロセスが連携するようなサーバーや GUI を動かしたい人はいないでしょう。
スレッドは対応
アクセラレータはマルチコアであることが多いため、スレッドの対応は必須です。
スレッド数はハードウェアスレッド数を上限とする
ソフトウェアのソースコード互換を大きく壊す可能性がありますが、機能と速度のバランスを目指しました。アクセラレータは計算が仕事であり、コア数以上のスレッド生成はオーバーヘッドが増え性能が下がるだけです。スレッド数の制御が困難な場合は、スレッドを自動的に扱うライブラリ(OpenMP など)の利用もありでしょう。
ファイルシステム、言語対応などの機能は対応しない
コードサイズの縮小、実装期間の短縮のためです。対応すること自体に問題はないです、が、おそらく要らないと思います。
MMU や特権モードは使わない
連動して動的リンクなども未対応です。将来的には対応するかもしれませんが、必須ではありません。

これらの制限が妥当かどうか?について今は結論は出ないので、実装して使って問題があれば今後修正したいと思います。アクセラレータや OS に詳しい方々の意見も聞いてみたいです。

アプローチ(ホスト側)

アクセラレータに処理を依頼する際のインタフェースはいくつかありますが、いずれも定番ではなさそうです。今回は OpenCL 風の API を採用しました。OpenCL 規格に準拠はしませんが、ある程度(例えば clinfo に応答できる程度)の OpenCL API を実装します(ホスト側のソースコードのリンク)。

ホストとアクセラレータ間のデータ移動や実行制御の方法も考える必要があります。ホスト側からアクセラレータ側に何か計算を依頼するケースと、もう一つアクセラレータ側のスタンドアローン実行(ホスト側から制御なしでアクセラレータ側のみ単独実行するモード)はデバッグの利便性を考えると、必須に近い機能です。

またホスト側に過度に依存しないように、ホスト側の API が気に入らなくなったら別の API を実装することができるように、アクセラレータ側の独自 OS とは別のリポジトリに分離して実装します。

実現方法

独自に OS を実装する道を選びました。既存の OSS を改造するより実装期間が短く済むと思ったくらいで、独自実装しなければならない強力な理由はないです。個人的な理由も入れて良ければ、独自 OS 実装に対する興味があったことが大きいです。

RTOS に Linux 互換レイヤを積む方法、Linux をダウンサイズする方法、などでも実現できるのではないでしょうか。Linux をダウンサイズする方法だとスレッド周りの制約実現が難しいですかね……?やったことがないので何とも言えません。

そんなの簡単にできるよ、という方はぜひ OS 作成フレンズになりましょう。

編集者: すずき(更新: 2023年 1月 9日 05:17)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 12月 17日

ブライトバンド

今日、東京や千葉で輪のような形で雨が降っていると教えてもらいました。本当だ……不思議な現象ですね。


降水量が輪の形になっている(松戸、取手、習志野の近辺)

この現象、調べてみると既に名前がついていて「ブライトバンド」と呼ぶそうです。かっこいい名前ですね。ブライトバンドについてはウェザーニュースの解説が非常にわかりやすかったです(参考: 秋田県の雨雲レーダーに映る 謎のドーナツ型の正体は? - ウェザーニュース)。

詳しくはぜひウェザーニュースの解説を読んでいただきたいですが、簡単に言えばレーダーが融解層(雪→雨に変わる部分)を捉えて過剰に反応している状態で、実際には強い雨が降っているとは限らないとのこと。

動かないブライトバンド、動いてしまう予報

ブライトバンドが出ているときに降水量の過去情報を見ると、ブライトバンドは出たり消えたりするだけで、その場からほとんど動かないことがわかります。


降水量が輪の形になっている(松戸、取手、習志野の近辺)


30分経っても移動しない(松戸、取手、習志野の近辺のまま、横浜の輪は消えた)

天気予報システムはブライトバンド=強い雨雲と解釈して予想をするようで、輪が他の雨雲とともに移動するような予報を出しています。気象の専門家ではないので「それが何か問題でも?」に対する答えは持ち合わせていませんが……。


1時間後の予報、輪が移動している(習志野の近辺が右に流れている)

ブライトバンドの付近での局所予報は少し食い違うかもしれませんが、過去情報と予報を見比べても特に破綻しているようには見えませんし、ブライトバンドを雨雲とみなそうが、無視しようが大勢に影響はないのでしょう。

編集者: すずき(更新: 2022年 12月 24日 04:14)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 12月 22日

x86 と ARM と RISC-V で CoreMark 対決

目次: RISC-V - まとめリンク

CoreMark を以前(2019年 7月 5日の日記参照)測りましたが、ARM 系の GCC のバージョンを上げたのと、x86 系と、RISC-V 系の FU740 の計測結果を追加しました。FU540 の値は以前のままです。

  • AMD Ryzen 9 5900X / 3.4GHz Turbo 4.9GHz
  • AMD Ryzen 7 5700X / 3.4GHz Turbo 4.6GHz
  • AMD Ryzen 9 3950X / 3.5GHz Turbo 4.7GHz
  • Intel Core i5 8250U / 1.6GHz Turbo 3.4GHz
  • Intel Core i7 6700 / 3.4GHz Turbo 3.8GHz
  • Intel Pentium J4205 / 1.5GHz Turbo 2.6GHz
  • Amlogic A311D(Cortex-A73 / 2.2GHz x 4, Cortex-A53 / 1.8GHz x 2)
  • Rockchip RK3588(Cortex-A76 / 2.4GHz x 4, Cortex-A55 / 1.8GHz x 4)
  • Rockchip RK3399(Cortex-A72 / 1.8GHz x 2, Cortex-A53 / 1.4GHz x 4)
  • Rockchip RK3328(Cortex-A53 / 1.3GHz x 4)
  • Rockchip RK3288(Cortex-A17 / 1.8GHz x 4)
  • Broadcom BCM2837(Cortex-A53 / 1.2GHz x 4, 32bit mode)
  • StarFive JH7110(U74-MC / 1.5GHz x 4)
  • SiFive FU740(U74-MC / 1.2GHz x 4)
  • SiFive FU540(U54-MC / 1.0GHz x 4)
  • NSITEXE NS31A(NS31A / 25MHz x 1)

動作周波数については後述します。

測定条件と結果

コンパイル条件は下記の通りです。

  • Ryzen 9 5900X: GCC-9.4.0 O2
  • Ryzen 7 5700X: GCC-12.2.0 O2
  • Ryzen 9 3950X: GCC-7.5.0 Ofast
  • Core i7 6700: GCC-9.4.0 Ofast
  • Core i5 8250U: GCC-11.2.0 Ofast
  • Pentium J4205: GCC-10.2.1 Ofast
  • A311D: GCC-9.4.0 Ofast
  • RK3588, RK3399, RK3328: GCC-10.2.1 Ofast
  • RK3288: GCC-10.2.1 Ofast, 32bit
  • BCM2837: GCC-8.3.0 Ofast, 32bit
  • JH7110: GCC-11.3.0 Ofast
  • FU740: GCC-10.2.0 Ofast
  • FU540: GCC-8.3.0 Ofast
  • NS31A: GCC-12.2.0 Ofast

Ryzen 7 はなぜか O2 より Ofast の方が遅かった(O2: 41946, Ofast: 40442)ので、O2 の結果を採用しました。RK3399 は CA72 と CA53 の 2種類のコアがあるので、taskset 0x1 ./coremark のように実行するコアを固定して計測しています。

CoreMark の Iterations/Sec の結果は CPU の動作周波数の影響を受けてしまうため、CPU の性能比較をする際は Iterations/Sec を CPU 動作周波数で割った値を使うことが多いです。

SoCCPU/micro archIterations/SecGHzCoreMark/MHzBoard/Machine
Ryzen 9 5900XZen 3 44345.89800 4.79.435
Ryzen 7 5700XZen 3 42040.35874 4.69.139
Ryzen 9 3950XZen 2 36140.22407 4.58.031
Core i5 8250UCabylake R29237.62883 3.67.694ThinkPad E480
Core i7 6700 Skylake 26963.26256 3.87.489
Pentium J4205Goldmont 13319.12627 2.65.122
A311D CA73 12491.41215 2.25.677Khadas VIM3
A311D CA53 5909.213000 1.83.282Khadas VIM3
RK3588 CA76 18228.21728 2.47.595Radxa ROCK 5B
RK3588 CA55 6745.983074 1.83.747Radxa ROCK 5B
RK3399 CA72 10218.15767 1.85.676Pine64 ROCKPro64
RK3399 CA53 4622.852300 1.43.302Pine64 ROCKPro64
RK3328 CA53 4215.259238 1.33.242Pine64 ROCK64
RK3288 CA17 8594.421439 1.84.774ASUS tinkerboard
BCM2837 CA53 3877.973113 1.23.231Raspberry Pi 3B
JH7110 U74-MC 5324.298161 1.53.549StarFive VisionFive 2
FU740 U74-MC 4134.509372 1.23.445SiFive HiFive Unmatched
FU540 U54-MC 2255.130422 1.02.255SiFive HiFive Unleashed
NS31A NS31A 58.1641290.0252.326Local RAM, FPGA(Digilent Arty A7-100T, Xilinx Artix-7)

やはり x86 系 CPU の速さは圧倒的です。Ryzen 7 は異次元の速さですし、ローエンド向けに思われがちな Atom 系コアも ARM Cortex-A72 を圧倒しています。(12/28 追記)Pentium J4205 の動作周波数が間違っていた(1.5GHz → 2.6GHz)ので修正しました。

RISC-V 勢は FU540(U54-MC コア)はかなり遅く、FU740(U74-MC コア)でやっと RK3328(Cortex-A53 コア)などの SoC と並ぶくらいです。FU740 を搭載した HiFive Unmatched は PC と同じホームファクタの Mini-ITX を採用しており、NVMe SSD やグラフィックカードが装着できる点などは非常に素晴らしいのですが……、PC の代わりに使用するとなると非力すぎて、RISC-V PC を名乗るにはまだ厳しそうですね。

CPU 動作周波数の取得

Linux で CPU の動作周波数を取得する方法は色々あって、イマイチ統一感がないですけれども、このベンチマークでは下記のようにしています。

  • x86 系: /proc/cpuinfo の cpu MHz 欄
  • ARM 系: /sys/devices/system/cpu/cpuN/cpufreq/cpuinfo_cur_freq
  • RISC-V 系: SoC 次第

FU740 の動作周波数は Core PLL(/sys/kernel/debug/clk/corepll/clk_rate の値 = 1196000000)から得ました。ARM 系は CPU 周波数が負荷に応じて変化するため、yes > /dev/null などを起動して CPU に負荷をかけた状態で見ています。

もし私が何か勘違いしていて CPU 動作周波数を間違えているとどうなるかというと、Coremark/MHz が間違った値になります。Iteration/Sec は変わりません。

編集者: すずき(更新: 2023年 2月 23日 00:03)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 12月 24日

サンタがマッハ 1 で街にやってくる

去年(2021年 12月 24日)と同様に、飛行機の位置をリアルタイムに表示する Flightradar24 というサービス(サイトへのリンク)にてサンタが出現しました。クリスマス・イブの日にサンタが出現するのは毎年恒例のお約束演出です。

去年のサンタはおかしくて表示された対地速度は 40kts なのに、サンタの位置から計算した速度はマッハ 2 = 1300kts と変な状態でした。今年は対地速度の表示は 727kts(1346.4km/h, マッハ 1.1 くらい)です。


23:49:35 時点の位置(緯度 22.2887度、経度 88.8772度)


23:50:35 時点の位置(緯度 22.4296度、経度 88.6613度)

去年同様、ある程度の時間をあけ(今回は 1分間)でどれくらい進んだか計算します。今回も距離の計算には国土地理院のページを使いました、緯度経度から距離を一発で計算してくれて便利です(サイトへのリンク)。


緯度、経度から距離と方位角を計算(国土地理院のサイト)

2地点間の距離は約 27.2km、時間差は 60秒から計算すると、対地速度は約 1,630km/h です。地上でのマッハ 1.3(ただし、サンタが飛んでいる高さ 38,000fts だとマッハ数はもっと高く出る)です。今年はそんなにずれていないみたいです。改善されましたねw

去年のサンタさんは、実質マッハ 2 という現代戦闘機+アフターバーナー並みの猛烈な速度で飛んでいましたが、今年はマッハ 1.3 と大幅にスピードダウンしました。とはいえスーパークルーズ(音速以上の飛行)であり、戦闘機並みの飛行性能であることは変わりありませんね……。来年の速度も気になります。覚えていたらまた計算してみましょう。

編集者: すずき(更新: 2022年 12月 25日 00:25)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年 12月 28日

ドラクエ 1 の「ド」

ドラクエ 1 がカタカナを削減していた話(「カタカナは20文字だけ」「没アイテムで宝箱がカラッポに」ファミコンハードの限界に挑んだ制作者たち - ねとらぼなど)は非常に有名です。ドラクエ 1 の背景テーブルの文字部分(左上です)を見ると、ねとらぼの記事に書かれていた通りカタカナは一部しか存在しません。


ドラゴンクエスト 1 の背景テーブル

さらに濁音や半濁音もありません。ドラクエ 1 の画面は 1文字に 2行使っていて、1行目は「濁点 or 半濁点」、2行目は「清音のかな or カナ」のように表示しているからです。


ドラゴンクエスト 1 の文字表示(1行につき背景キャラ 2つ分を使う)

利点はもちろん濁音や半濁音をテーブルから排除できることです。欠点としては一度に表示できる行数が減ることですが、ひらがなばかりのメッセージ欄に読みやすい行間を作り出す手法として活用していて、素晴らしい工夫だと思います。

特別な濁点、半濁点

ドラゴンクエストはハードの限界に対する工夫にあふれていて本当に面白いですが、不思議な点も見受けられます。

1つ目の不思議な点は「名前用の濁点・半濁点」です。通常のメッセージ欄で使っている濁点・半濁点とは別に専用の濁点・半濁点が用意されています。不思議と言っておいてなんですが、これは理由が割と明確で UI デザインの都合だと思われます。


名前欄専用の濁点・半濁点

素人考えだと、メッセージ欄用の濁点・半濁点を再利用すればもっと背景テーブルを節約できる?と思いますが、実際にやってみると一発でダメなアイデアだとわかります。


名前用の濁点・半濁点の表示


メッセージ欄用の濁点・半濁点を使ったときの表示

無理やり再現するとこんな感じです。点が右下にきてしまいおかしいな表示になります。

特別な「ド」

2つ目の不思議な点は「ド」です。これは私が見た限りでは名前専用の濁音・半濁音と違って「ド」を特別扱いする強い理由が見当たりませんでした。「ド」とは何のことかというと、背景テーブルの「ラ」「ロ」の横にある「ド」です。2行下に「ト」があるため「ド」=「ト」+「゛」で表現できますが「ド」だけ特別扱いです。


濁音「ド」だけ特別に存在する

まず理由として思いつくのは、コマンド欄の UI デザインの都合です。コマンド欄は上に余裕がなく、メッセージ欄のように 2行使って濁点を表現する方法は使えませんから、特別に文字を用意せざるをえなかった?という推測です。


コマンド欄

もっともらしいんですが、下記のように名前用の濁点を使えば「ド」=「ト」+「゛」に分解できます。頻繁に目にする部分であり、見た目が良くないから避けたのでしょうか?しかし同じくらい目にする名前欄は良いのにコマンド欄だけこだわる理由は?……どうも説得力に欠けます。


コマンド欄の「ド」を分解

もう 1つ思いつくのは、後から「ト」を追加したが既に「ド」を使ってたくさんのメッセージを書いてしまい「ト」+「゛」への修正が(時間、手間的に)困難だったのでは?という理由です。「ミスキト」が別領域にあること、メッセージに使われている「ド」が「ト」+「゛」になっていない点からの推測です。


メッセージの「ゴ」は「コ」+「゛」、「ド」は特別(「ト」+「゛」ではない)

しかしこれも「ラダトーム」のように「ト」を使っている部分は既にあったはずなのに、「ド」だけ修正が困難だった?……というのはちょっと強引な気もしますね。正解は当時の開発に携わっていた人でないとわかりませんけどね。もしご存じの方は教えていただけると嬉しいです。

編集者: すずき(更新: 2023年 1月 3日 00:04)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報