パイプライン並列化のバランスについて考えてみます。
RISCプロセッサのパイプライン処理のようなきれいな階段状の流れができれば無駄なく並列動作することができます(RISCプロセッサの場合もインタロック等の問題がありますが)。
おそらく、課題の4つのパイプライン処理が同じ処理時間で終わるのであれば、理想の並列動作になってくれるのではないかと思います。
パイプライン処理のバランスが不均等であるときは、どうなるでしょうか。
下の図は4色のパイプラインステージ処理が不均等の時の流れを表しています。箱内の数値は処理にかかる時間と考えて下さい。分かりやすくするため各ステージで動作する関数は1つずつにしてあります。
2番目の赤い箱の時間が遅い時、この処理の前に隙間ができ、徐々に遅れます。このパイプライン処理で3・4番目の処理を高速化しても意味がありません。
1番目の処理の高速化は無効化ではなさそうですが、隙間なく動かすためには2番目の処理を高速化するのが良さそうです。
この図では、4つのスレッドで動作していますが、もう1つスレッドを追加して2番目の処理を2つ動かす方法もあります。
時間のかかる2番目のステージ処理を2つ動かし、処理時間を5-1と5-2に区別して2つの処理が交互に動く絵にしてみると、前のパイプライン図にあった隙間が無くなりそうです。
しかし、課題のプログラムで、このように遅いステージを多く動かしてみましたが、残念ながら、ほとんど効果はありませんでした。ステージの均等化が効果として見えるのは、よほどバランスの悪い場合に限られるのかもしれません。
プロファイリングの情報からは、キューの登録・取り出しが非常に多いことも判っていました。
キューには、4つの処理を繋ぐデータが入っています。
最初は深く考えず、1つのキューに1つのデータを入れていました。具体的には、0*0のデータ、0*1のデータ、0*2のデータ、というように1キューに1つの掛け算データを入れていたので全体では大量のキューが繋がれていました。
キューの数を減らすためには、1つのキューに多くのデータを入れることになります。コンパイル時にキュー内のデータ数を指定できるように改造していくつかのデータ数で試したところ、処理性能に大きな影響がありました。
EMC組み込みマルチコアサミット2020、セミナー資料より
表の「一度に処理するデータ数」は、1つのキューに入れるデータの数です。「スレッド構成」の4×1は、各ステージに1つずつのスレッドを動かした場合で、4×2は2つずつのスレッドを動かした時の場合です。
青色の処理速度“41.08”は、逐次処理の速度を超えました。
最初の18時間半という遅さと処理の複雑さを考えると、逐次処理を抜くのは無理だろうと考えていましたが、ここまで改善するとは驚きです。
次回は、各並列化処理の性能比較とプロファイリング情報等について説明します。
コメントをお書きください