掛け算処理、割り算処理に続いて並列処理です。
(最初から3回記事として計画していましたが今回は毛色が違いフローチャートはありません)
コンピュータ(CPU)にとって命令を実行するのに早い・遅いというのは、
命令の所要クロックサイクル = Operation Cost in Cyclesで公表されているのですが、
前回の割り算処理記事の末尾に記載した参考情報では、
- ”Simple” register-register op(ADD, OR, etc):単純なレジスタ間操作(加算、OR、etc→減算も含みます) <1(1より小さい)クロック消費
- Multiplication(Integer/float/vector):掛け算(整数/実数/ベクター(32bit4段で並列乗算する)) 1-7クロック消費
- Integer division:整数除算 15-40クロック消費
- 128-bit vector division:128ビットベクター除算(32bit4段で並列除算する) 10-70クロック消費
- Floating-point division:実数除算 25-70クロック消費
上記の赤字数値がまさに速度を表しています(数値が小さいほど速い)。
例えば、
- メインCPUが1GHzの場合は数値が1(= 1クロック消費)なら「10億分の1秒」
- メインCPUが2GHzの場合は数値が5(= 5クロック消費)なら「20億分の5秒」
の速さで命令が実行される…となります。 - 本来1クロックが命令実行速度の最小単位なので「<1(1より小さい)」はあり得ないのですが、最近のCPUは命令の最小単位よりも短いクロック数で命令実行してくれる例があるようです。
- 「Integer division:整数除算 15-40クロック消費」とは除数の値次第(2のべき乗だと速い)で、15クロック~40クロック消費量が割り算処理(コンピュータは割り算が苦手)変化する(→処理時間にブレがある)ということです。
前回記事でも結論付けましたが、割り算処理が際立って遅いということがわかりますね。
単位が「数十億分のx秒」となっているので「遅い」という言い方が適切なのかわかりませんが、単なる四則演算でも苦手な分野があるというのは間違いありません。
(苦手分野の克服という訳でもないのでしょうが)並列処理を実行することによって演算処理を見かけ上速くする技術があります。
例えば、Pentiumプロセッサではかなり初期の頃でも、MMXレジスタに対してSIMD命令を実行することによって複数の整数演算を同時に実行することができました(現在はSSE命令セット推奨となっています)。
#具体的には128bitのMMXレジスタ(87コプロレジスタ)を32bitレジスタに4分割して
#それぞれパラメータをセット、
#1命令を実行するだけで4つの演算が並行に実行されるというものです(つまり見かけ上4倍の速さとなる)。
↓CPU命令サイクル表に記載されている以下のことです。
- 128-bit vector division:128ビットベクター除算(32bit4段で並列除算する) 10-70クロック消費
4命令同時実行なので実質1命令に必要なクロック消費量は2.5-17.5クロックですね。
この並列処理のメリットを享受できるのは、お互いの計算結果に依存関係を持たない独立した演算処理が大量にある場合に限ります。
そんな都合の良い状況あるのか?…という印象を受けると思うのですが、実はあるのです。
それが、「画像処理」と「AI」になります。
Nvidia社は知る人ぞ知る画像処理に特化したGPUメーカーですが、画像処理に特化したGPUのアーキテクチャが実はAIに応用が利くということが知れ渡り、IT業界で今躍進しています。
GPUのような画像処理に特化したチップはCPU以上に日進月歩でどんどん扱えるデータ量が増えてきています。
最新のGPUではプロセッサを1万以上内蔵といったモデルも珍しくなく、これからも増えます。
これがまさに日進月歩のAIの技術開発とマッチしていたということになります。
Intel社としてはこのAI分野の遅れをとった部分を取り戻すべく去年(2023年)の12月「Core Ultra プロセッサ」を発表しています。
今後、機械学習のワークフローはクラウドではなくローカルで処理するように変化していくとのことで、開発者としても今後の動きに注目です(開発環境が非常に気になります)。
そして技術者として少しでも時代に取り残されないために、
「OpenMP(スレッド分割による並列処理)」とか
→比較的簡単に実装できる。事例もわかりやすい。
「SIMD&SSE命令セット(CPU演算による並列処理)」とか
→コンピュータアーキテクチャを知り尽くした上級者向けの実装できめの細かい実装になる。
「GPGPU(GPUを使った画像処理以外の並列演算処理)」とか、
→組み込み開発ではあまり使うことのない技術かもしれない。勉強中です。
#それぞれ使える場面と有効さを感じるポイントが違います。
並列処理で実現でき、効果が高い処理があれば、あらためて記事化してみたいと思います。
3回にわたり、ありがとうございました。