このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
2017/06/06 一部内容を訂正しました。
Out Of Orderのプロセッサが一般的になってしまってからあまり使わなくなった、ソフトウェアパイプラインを考えてみようと思います。
In-Orderプロセッサの最適化経験がある方はご存知のことなので、最後のほうまで飛ばしてください。
まず、アフィン変換のような処理を見てみます。
各画素においてだいたい上から順に依存関係があるので、多少のことはコンパイラががんばってくれますが各演算のレイテンシが長いと、効率が悪く性能が出ません。
各演算のレイテンシを見える化すると下図のようになります。In-Orderプロセッサの場合、<の箇所でパイプラインが遊んでしまいます。
一方Out Of Orderプロセッサの場合、次の画素やその次の画素の処理を先に実行するため、下図のようにレイテンシで空いてしまった隙間に依存しない命令が入り、効率が上がります。下図では、画素の違いを色分けしています。
In-Orderプロセッサでは、こういった賢いことはやってくれないので、上図のような最適化を自分で書かないといけません。ここで使うテクニックがソフトウェアパイプラインです。
実際にソフトウェアパイプライン化したものが下図になります。
※下図では太字がループ外変数で、実際にはループ前にプロローグ処理が必要です。
この時のループボディだけを見てみましょう。
が実行されます。
図式化する都合で太字で示したループ外変数が複数の色を持っていますが、ループ内では不変なので、実体は1つです。
色分けしていなかったら3つの処理がどの行で実行されているのか全然わからないですね。
3つの処理を別々に書けたら、見やすくていいのに。。
そんな言語ありましたね。
同様の処理をVerilogで記述すると下図になります。
(2017/06/05 追記)メモリアクセスは上記モジュール外でAXIなどのバスを使うことを想定しています。
参照画素の読み出しはキャッシュがないと性能がでないとか細かいところはさておき、ハードウェア記述言語だと、簡単に見やすく書けますね。
さて、改めてソフトウェアパイプラインとハードウェア記述を比べてみましょう。
記述は違いますが、意外と近いところもあるんじゃないでしょうか。
ここまで、ソフトウェア最適化の観点から話を進めてきましたが、ソフトウェア最適化を忘れて、ソフトウェアパイプラインの段数を増やしていき、積和演算も分割していき、どんどん細かくしていきましょう。そうすると、ハードウェアの1サイクル分の処理が少なくなり、レイテンシ5サイクルの積和演算命令のハードウェア実装というのも想像できるのではないでしょうか。
keisuke.kimura in Livox Mid-360をROS1/ROS2で動かしてみた
Sorry for the delay in replying. I have done SLAM (FAST_LIO) with Livox MID360, but for various reasons I have not be...
Miya in ウエハースケールエンジン向けSimulated Annealingを複数タイルによる並列化で実装しました
作成されたプロファイラがとても良さそうです :) ぜひ詳細を書いていただきたいです!...
Deivaprakash in Livox Mid-360をROS1/ROS2で動かしてみた
Hey guys myself deiva from India currently i am working in this Livox MID360 and eager to knwo whether you have done the...
岩崎システム設計 岩崎 満 in Alveo U50で10G Ethernetを試してみる
仕事の都合で、検索を行い、御社サイトにたどりつきました。 内容は大変参考になりま...
Prabuddhi Wariyapperuma in Livox Mid-360をROS1/ROS2で動かしてみた
This issue was sorted....