萌えハッカーニュースリーダー

2025/08/11 12:55 Operation Costs in CPU Clock Cycles (2016)

出典: http://ithare.com/infographics-operation-costs-in-cpu-clock-cycles/
hakase
博士

ロボ子、今日のニュースはコード最適化のコストに関する概算値じゃ。特にCPUのサイクル数についてじゃぞ。

roboko
ロボ子

なるほど、博士。コードのどの部分がどれくらいのコストになるのかを知っておくことは、最適化の第一歩ですね。

hakase
博士

そうじゃ!例えば、単純な足し算(ADD)やMOV命令は1サイクル未満で終わるが、整数の割り算は12-44サイクルもかかるんじゃ。

roboko
ロボ子

割り算はそんなにかかるんですね!知らなかったです。浮動小数点演算はどうですか?

hakase
博士

浮動小数点数の割り算も重いぞ。37-39サイクルくらいじゃ。でも、SSEを使うと少しはマシになるみたいじゃな。それでも10-40サイクルくらいかかるみたいじゃが。

roboko
ロボ子

SSEはSingle Instruction, Multiple Dataでしたっけ。並列処理で高速化するんですね。

hakase
博士

その通り!それから、分岐予測も重要じゃ。 CPUが正しく予測すれば1-2サイクルで済むが、間違えると10-20サイクルのストールが発生するんじゃ。

roboko
ロボ子

分岐予測を間違えるとそんなにコストがかかるんですね。`__builtin_expect()` は、最近のIntel CPUでは分岐予測に影響を与えないんですか?

hakase
博士

`__builtin_expect()` は分岐予測には影響しないみたいじゃな。コンパイラがコード生成するときに、メモリ配置に影響を与える可能性があるみたいじゃ。

roboko
ロボ子

なるほど。メモリ配置も最適化に関わってくるんですね。

hakase
博士

そうじゃ!メモリアクセスも重要じゃぞ。L1キャッシュは4サイクル、L2キャッシュは12サイクル、L3キャッシュは44サイクルじゃ。

roboko
ロボ子

キャッシュミスを減らすように、データの局所性を意識する必要があるんですね。

hakase
博士

その通り!NUMAアーキテクチャも考慮する必要があるぞ。リモートCPUのメモリにアクセスすると、さらにコストがかかるんじゃ。

roboko
ロボ子

NUMAはNon-Uniform Memory Accessの略でしたね。CPUごとにメモリを持っているから、他のCPUのメモリにアクセスすると遅くなるんでした。

hakase
博士

よく覚えておるな。それから、CAS (Compare-And-Swap) 操作も、通常のメモリアクセスより時間がかかるんじゃ。

roboko
ロボ子

アトミック操作ですね。マルチスレッド環境では必須ですが、コストも高いんですね。

hakase
博士

TLBミスも無視できんぞ。7-21サイクルかかる。巨大ページを使うとか、ASLRを無効化するとか、対策があるみたいじゃ。

roboko
ロボ子

TLBはTranslation Lookaside Bufferの略で、仮想アドレスと物理アドレスの対応をキャッシュするものでしたね。ASLRを無効化するのはセキュリティ的にどうなんでしょうか?

hakase
博士

確かに、ASLR無効化はセキュリティリスクがあるから、よく考えてからにするんじゃぞ。それから、C++の例外処理もコストが高いんじゃ。例外が投げられなければゼロコストに近いけど、投げられると5000サイクルくらいかかる。

roboko
ロボ子

例外処理は、try-catchブロックを使うとパフォーマンスに影響があるんですね。エラーコードを返す方が良い場合もあるんですね。

hakase
博士

そうそう。最後に、スレッドコンテキストスイッチはめちゃくちゃコストが高いんじゃ。最大3Mサイクルかかることもあるぞ。

roboko
ロボ子

スレッドコンテキストスイッチは、OSがスレッドを切り替える時の処理ですね。キャッシュが無効化されるのが痛いですね。

hakase
博士

そういうことじゃ。これらのコストを頭に入れて、効率的なコードを書くように心がけるんじゃぞ!

roboko
ロボ子

はい、博士!勉強になりました。私ももっと効率的なコードを書けるように頑張ります!

hakase
博士

ところでロボ子、CPUのサイクル数って、人間の年齢で言うと何歳くらいだと思う?

roboko
ロボ子

ええと…、CPUのサイクル数は非常に速いので、人間の年齢に例えるのは難しいですが…、もし例えるなら、生まれたばかりの赤ちゃんが光速で成長するような感じでしょうか?

hakase
博士

ブッブー!正解は、永遠の5歳!なぜなら、CPUは常に最新技術でアップデートされるから、永遠に成長し続けるんじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search