当サイトはリアルタイムコンピューティングを謡っておりますが、反対に非リアルタイムとか、ノンリアルタイムと呼ばれるものの厄介さを少し取り上げてみたいと思います。
リアルタイム処理には、ハード・リアルタイム、ソフト・リアルタイム、ファーム・リアルタイムなどいくつかカテゴリがあったりしますが、今回はそういう小難しい話はおいておいて、どれにも該当しないリアルタイムじゃないものをざっくり題材にします。
要するにいつ計算が終わるかのコントロールが効かないも全般ですね。
よくある誤解
よくある誤解が、「リアルタイム性の問題は計算機が高速になれば解決する」という誤解です。残念ながら、これは間違っていて、リアルタイム保証を困難にしている要素を完全に取り除かない限りは、決まった時間内に計算が終わらない確率はゼロにならないことが多いです。正規分布がどこまでいってもゼロにならないのに似ていますね。
リアルタイム保証を難しくするもの
プログラムの中からは予測できずに突然、CPUに負荷がかかるなど、実行時間を急に伸ばす要因は多数あります。
- 突然LANポートに大量のパケットが届く
- 急にガベージコレクションが動く
- 急にHyperViserが別のOSにCPUを割り当てる
- 不定期に使っているPCIe上のGPUにOSモニタから問い合わせが入る
- 急にSSDのウェアレベリング処理が走る
- 急にウイルスソフトが定期スキャンを始める
- 急にOSがファイルインデックス作成を始める
- 急にバッテリーの為に特権モードの電源制御コードが走る
- 急にユーザーが巨大なファイルのコピーを始める
- 急にスクリーンセイバーが動く
- CPUが発熱してきたので急にOSがCPUクロックを下げる
- 外部SDRAMのリフレッシュタイミングとかち合う
- 急に割り込み処理にキャッシュが汚されキャッシュミスが起こる
- 特定条件で分岐予測が外れる
などなど、無限に思いつくわけです。
特にN社のGPUなどは、そのデバイスドライバを動かすために Windows や Linux などを必須とするので、上のような要因を完全にすべて除外するのはなかなか難しわけです。
多くの場合パソコンなどはこのような条件下で動いていますので、センサーが異常を示したら0.1秒以内に安全弁の制御を始めないと炉が吹っ飛ぶような用途の制御で、パソコン繋いで制御ソフト書けばいいじゃないですか?、とはならないわけです。
そもそもがベストエフォートな処理たち
次にこれらの要因を置いておいても、そもそもベストエフォート(出来高払い)な処理は沢山あるわけです。
ベストエフォートな処理の大半は、メモリあるデータを読み出して演算してメモリに書き込むパターンとして実装されることが大半です。
メモリ上のデータは上書きするまで消えませんしアクセス順序も自由ですので、計算時間が読めず、データ依存でアクセスパターンが変わるようなアルゴリズムも許容されます。
そして多くの場合、データのサイズ(N)が倍になったときに、計算時間も倍になったり O(N)、あるいは O(N^2) だったり、O(N logN)とか O(N!) とか様々です。
ここでは簡単に計算量がデータ量に比例する場合であっても、データサイズが倍になったからと言って計算時間も倍では済まないケースがあります。データが大きくなることによってキャッシュにデータが乗り切れなくなって計算時間が一気に伸びるなんてこともざらです。
グラフ探索のようなデータ依存でアクセスパターンや探索の深さが変わるようなものだと、キャッシュのヒット率などもデータ依存で変化する為、ワーストケースを見積もるのはどんどん困難になっていきます。
FPGAを持ってくれば解決するのか?
ここまで述べたリアルタイム性確保の課題に、FPGAを持ってくれば解決するのかと言うと当然そんなことはありません。
そもそも、FPGAにソフトコアCPUを作ってしまったり、同じような動作パターンのアクセラレーターコアを作ってしまうと同じことが起こります。特に、FPGAであることをなんら意識せずハードウェアアーキテクチャを考えないまま高位合成言語(HLS)で書かれたプログラムを持ってきてもなんら解決になっていなかったりすることもしばしばです。
あえて言うなら他のプロセスの影響を受けにくい点はあるのですが、これも同じSDRAMを別処理と共有していたりなどすると同じことになりかねません。
ちゃんと理解して信号処理アーキテクチャを実装するという事
一方で、ハードウェアアーキテクチャをしっかり理解し、データ帯域や処理帯域などちゃんと理解し、タイミングチャートが頭の中にある状態できちんと設計された回路はちゃんとリアルタイム保証ができます。
加えて、そもそも処理時間が固定であれば、一度メモリに溜める事自体不要だったり、小さなバッファメモリで済むことも多々あります。
これはメモリの節約と言うコストダウンだけでなく、処理遅延の低減と言う応答性増加にも繋がります。
こういったことは、しばし計算機アーキテクチャを考えるだけでなく、計算機アーキテクチャにあったアルゴリズムを考える事によっても高い効果が得られます。
しばしFPGA設計者は、CPUやGPU用に設計されたアルゴリズムを如何にFPGAでアクセラレートするか考える事を問われがちですが、FPGAを前提としたときにその性能を最大限引き出せるアルゴリズムを逆算で考えるという事もとても大切です。
おわりに
今日の記事は、散歩中に、リアルタイム保証の邪魔になる要因をいろいろ頭の中にリストアップしていたら、山ほどあって忘れそうだったので軽くメモしたものが元なのですが、少し脱線してしまったかもしれません(笑)
パソコンでリアルタイムシステムを作るのが簡単でないことは少し記載できたと思います。マイコン+RTOSなども解ではあるのですが、これはこれで案外大変です。
いっそFPGAというのもなかなか切れ味の良いソリューションであることがお伝えできれば幸いです。
コメント