Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

思考のサルベージ(その9)

各工程で心がけたい思想を掘り起こしてみる

以前「ハードウェアインターフェース」について考えてみました。今回も詳細設計・実装におけるHWの利用方法について考えてみます。

事前実験

  • 2BYETデータA[可変]、4BYTEデータB[可変]を連結する。
  • 2BYTEのチェックサムを付与し、8BYTEのデータをメモリ上に生成する。
  • これを512回繰り返し、8BYTE×512=4KBのデータを生成する。ただし、データBは先頭から[+1]インクリメントする。

上記の処理を、ある処理シーケンスの中に実装するとします。ただし、この処理シーケンスはスピードを求められているので、事前に実験コードを作成し、処理速度の見積もりを出しました。実験では許容範囲の処理性能を出すことができました。

本実装

実験コードを製品版に反映します。実験の時には明確になっていなかった仕様や制限事項をコードに反映しなければならないので実験結果に比べ多少のオーバーヘッドが加算されることは予想できました。 都合の良いことに以下のようなHWサポートが使用できることがわかりました。処理性能は向上が見込めるので早速コードに取り入れました。

  • 2BYETデータA[可変]、4BYTEデータB[可変]、処理回数をレジスタに設定する。
  • 4BYTEデータB[可変]はレジスタ設定値から処理回数に応じて[+1]インクリメントする
  • 2BYETデータA[可変]はレジスタ設定値レジスタ設定値をそのまま使用する
  • 2BYTEのチェックサムを付与し、8BYTEのデータを生成する。
  • 処理回数×8BYTEのデータをDataBusを介してメモリ上に作成する

HWサポート導入による性能劣化

本実装で性能測定をしたところ、実験結果と比較して大幅な性能劣化が見られました。処理シーケンス内のどこで処理時間がかかっているか確認したところ、まさにHWサポートを導入したところでした。

  • これを512回繰り返し、合計4KBのデータを生成する。

ここがポイントでした。 本実装に導入したHWサポートでは、4BYTEデータB[可変]はHWで更新してもらえますが、 2BYETデータA[可変]はレジスタ設定値がそのままHW内使用で使用されてしまうのでSWで512回生成しなければなりません。結果的にHWを起動する回数も512回となります。 HWにも前処理・後処理のオーバーヘッドが乗るので、512回に及ぶHW起動・終了がそのまま処理性能に影響していました。処理回数「1」のケースでは、データ生成処理でHWのやることは「チェックサムの生成」だけなので、いくらDataBusを介してメモリアクセスしても処理速度の向上はたかが知れています。

導入したHWサポートは大量のデータを取り扱う時にこそ威力を発揮するもので、データ量が少ない場合は効果の期待できないものでした。

何か掘り起こせた?

  • HW機能には、向き・不向きがある。
  • 仕様に対して、HWサポートが有効か考慮が必要。

HWは速いと思い込んでいると、痛い目にあいますね。

おしまい

もともとの仕様では2BYETデータA[可変]は、固定だったんですけどね。そのうえでのHWサポートでしたから。このHW機能使われずじまいでした。