思考のサルベージ(その14)
各工程で心がけたい思想を掘り起こしてみる
処理性能を求められるシステムでは、CPUを最大限有効に稼働させなければなりません。「空いた時間の上手な使い方」について考えてみます。
HWサポート
複数個のデータを元に複雑な演算をする必要があるとします。ソフトウェアによる演算では処理時間がかかりすぎてしまうので、この演算専用のハードウェア.Aを搭載してもいました。仕様はざっくり次のような感じです。
- データ設定レジスタにデータを設定する
- 起動レジスタに1を書き込むことで演算を開始する
- 演算が終了すると終了レジスタに1が書き込まれる。
- 終了レジスタに1を書き込むと同時に、結果レジスタに演算結果が書き込まれる。
この手のHW.Aにアクセスするドライバとしては以下のようなものも考えられます。
- 1.データ設定からHW起動までを行うstart関数
- 2.演算終了レジスタをポーリングし、演算が終了したら演算結果を返すwait関数
- 3.1と2をパッキングした、startend関数
3のstartendようなドライバであれば、HW.Aを使うSWでは、ドライバ一つ呼ぶだけで演算結果を使って次の処理に進むことができます。単純明快な処理となるので、bugを埋め込むリスクも小さくなります。
空き時間
SWによる演算より速いとはいえ、HW.Aの演算にも時間はかかります。そこで、演算結果を取得した後に続く処理に目をつけてみます。当然、演算結果が無ければ実行できない処理があります。しかし、HW.Aから取得できる演算結果の他に、後続処理で必要なデータがあるならば、HW.Aの演算終了を待つ間に他のデータの収集する処理を行っておけます。
[ startend ]→[他のデータ収集]→[後続処理]
[start]→[他のデータ収集]→[wait]→[後続処理]
[他のデータ収集]がHW.Aの演算時間に収まればその分の処理時間を削減することができます。
できることできないこと
上記では単純化なモデルケースで説明しています。実際にシステムで稼働するSWはもっと複雑な実装になっているでしょうが、同様のやり方で、HWの処理時間の裏で他の処理を実行させることは可能でしょう。 ただし、注意も必要です。例えばHW.A起動中の裏で実行したい処理が別のHWを用いるような処理であれば、HW同士の同時起動に制約がないか確認する必要があります。同時起動自体は可能でもHW同士が同一メモリにアクセスするようなケースではbus接続の影響でアクセス競合が起こる可能性もあります。こうなるとHWを用いても性能を引き出せないといったことになってしまいます。こうなっては折角のHWサポートも電力を使うだけで、なんの効果も生んでくれません。
何か掘り起こせた?
空き時間を有効に使うには、HWの仕様・特性をきっちり把握する必要があります。
- 使用するHW、アクセスするメモリ等を考慮する必要があり
- 設計段階でやれることやれないことを整理しておく。
おしまい
HWサポートを一つ搭載するにもそれだけのコストをかけるということ。本当にそのサポートが必要かも含め、どうすれば性能を引き出せるかをきっちりと検討したいですね。