マルチコアCPUの使い方:「並列処理」と「パイプライン処理」で性能を引き出す

コンピュータ

CPUがマルチコア化され、今や現役で使われているPCのほとんどが複数のコアを搭載しています。
ところが、せっかく最新のRyzenやCore iシリーズを使っていても、**体感的には“そこまで速くなった気がしない”**ということがよくあります。

実際、タスクマネージャーを開いてみると、1つのコアだけが100%になっていて、他のコアは暇そうにしている――そんな状況を見かけたことはないでしょうか?

なぜ高性能なCPUを積んでいても、期待したパフォーマンスが出ないのか?
その原因を調べていくと、**「並列処理」と「パイプライン処理」**というキーワードにたどり着きました。

この記事では、マルチコアCPUを本当に活かすための設計思想と実践のヒントを、自分なりにまとめてみました。
勘違いや誤り、ハルシネーション的な推論が含まれている可能性もありますので、話半分で読むことをおすすめします。

CPUの「マルチコア」と「マルチスレッド」とは?

「マルチコア」とは、1つのCPUパッケージの中に複数の“CPU(コア)”が存在するような構造のことです。
見た目は1個でも、実質的にはCPUが複数載っているようなもので、同時に複数の仕事をこなすことができるようになります。

一方の「マルチスレッド」は、そのマルチコアCPUで同時に処理できる“作業の流れ”の数と言えます。
Intelでいう「Hyper-Threading」や、AMDでの「Simultaneous Multi-Threading(SMT)」がこれにあたり、1コアで2つのスレッドを処理できるという仕組みです。

つまり、

・マルチコアは、物理的な“作業員”の人数

・マルチスレッドは、その作業員が同時に進行できる仕事の数

と考えるとイメージしやすいでしょう。

処理できるスレッド数が多ければ多いほど、同時にこなせる仕事の量が増えるため、一般的にCPUの処理能力は高くなります。
この「同時処理能力」を測る指標としてよく使われるのが、マルチスレッド性能です。

ベンチマークソフトでは、シングルスレッド性能(1つのコア・1スレッドでの処理能力)とは別に、全コア・全スレッドをフルに使ったときのスコアをマルチスレッド性能として表示しています。

では、マルチスレッド性能が高さが、体感の速さに連動しないのは何故でしょうか?
その、原因を少しずつ紐解いていきます。

並列処理とは

並列処理が出来れば、マルチコアCPUが生きてくる、これは多分間違いのない話。
残念ながら、並列処理が出来る状況は、ひどく限定的だったりします。

・処理の順番が順不同でも問題ない処理であること。
・他の処理との競合しないこと。(メモリやファイルのなどの同時読み書きなど)

などがあげられます。lock機構などを用いることで、競合部分は回避できますが、その分パフォーマンスが落ちます。

ほかにも色々条件がありますが、基本的にこちらの条件に当てはまらないと、並列化は出来ませんし、出来たとしてもパフォーマンス向上になつながりません。

処理が順不同であることが、一番ハードルが高い条件で、リアルな仕事でも同じ仕事を複数の人間行って効率が上がるかは、仕事の内容によりますよね。

そして、パイプライン処理へ

基本的に、並列処理ができなければマルチコアCPUの能力は活かせない。
それまで自分は、そう信じ込んでいました。

「複数の処理を同時に動かせなければ意味がない」と。

しかし、直列処理をパイプライン処理に置き換えることで、マルチコアCPUの能力を生かし、バッチ処理の高速化出来る可能性を秘めています。

パイプライン処理とは

パイプライン処理は、直列処理の各工程(ステージ)を独立した処理に分けて、おのおの別のスレッドで動作させます。
各工程の処理が完了したら次の工程に仕事を投げることで、処理の順番を守りながら、各工程を同時に進行することができるので、処理効率向上が期待できます。

どの程度のパフォーマンス向上が目指せるかと言いますと、一連の工程で一番時間の要する処理に律速することになります。

例えば、画像ファイルの縮小処理を考えると、

画像ファイルの読み込み5ms⇒デコード100ms⇒縮小50ms⇒結果を保存10msだったとします。
合計で165msかかる計算に成りますが、パイプライン処理にすると、各工程で一番時間のかかっているデコードの工程の100msで済む(律速する)ことに成ります。

マルチコアCPUを活かすために

基本ソフトウェアは一つのコアしか使いません。
マルチコアCPUでは、その1つ以外のコアは遊んでいることに成ります。
暇を持て余している、コアに仕事を割り当てることが、マルチコアCPUを生かすという事に他なりません。

その方法論として、多量にある同じ仕事を、複数で分散処理する「並列処理」と、各工程を処理する専門家を用意し、流れ作業にする「パイプライン処理」があります。

特に古くから存在するソフトは、開発された当時の標準的パソコンのスペックを想定して作られていたり、また、比較的新しいソフトだったとしても、実行する最低要件のスペックに合わせる関係上、マルチコアを想定したソフトウェアは作りにくい事情も考えられます。

結論として言いたいことは、CPUのベンチマークテストの結果で見るべき数値は、シングルスレッド。これが速いCPUは体感も速い。
そして、マルチスレッド性能を思うがままに体感したければ、自分でプログラムを組むしかない。そう、自己満足の世界へようこそ

自由自在にプログラミングが出来るスキルがあれば良いのですが、自分には夢のまた夢。

コメント