MSVC v140でコンパイルされた小さなC++プログラムを逆アセンブルし、コード設計がパフォーマンスにどのように影響するかをよりよく理解するために、1命令あたりのサイクル数を見積もっています。私は"Data-Oriented Design and C++"のマイク・アクトンのCppCon 2014講演、特に私がリンクした部分に従っています。それに命令あたりのサイクル数の見積もり
、彼はこれらの行を指摘する:
movss 8(%rbx), %xmm1
movss 12(%rbx), %xmm0
彼はその後、これらの2×32ビットの読み取りと主張しているので、おおよそ〜200サイクルを要する同じキャッシュラインにおそらくあります。
Intel 64 and IA-32 Architectures Optimization Reference Manualは、特に「付録C - 命令のレイテンシとスループット」です。しかし、のC-15ページの「表C-16。ストリーミングSIMD拡張単精度浮動小数点命令」はmovssが1サイクルであることを示していますもしそうなら、私はこの物をどのように読みますか?)
私はtheoretical prediction of execution timeが決して正しいとは限りませんが、これは学ぶことが重要であることを知っています。 これらの2つのコマンドはどのように200サイクルになりますか?このスニペットを超えて実行時間についての理由を知る方法を教えてください。
私はCPUパイプライニングでいくつかのことを読み始めました。おそらくサイクルの大部分がそこに集められていますか?
PS:実際にここでハードウェアパフォーマンスカウンタを測定することには興味がありません。私はちょうど合理的な視力がASMとサイクルを読む方法を学ぶために探しています。
あなたはAgner Fogの仕事を見ましたか? http://www.agner.org/optimize/instruction_tables.pdf –
サイクルはもうカウントできません。今は長い間そうではありません。パイプライン化、キャッシュ、分岐予測など...パイプライン化は、工場のような組み立てラインに過ぎません。あなたは1つのことを構築するために117のステップまたはステーションを持っているかもしれませんが、それぞれが30秒かかるかもしれませんが、それは生産ラインのために1時間に1つではなく30秒ごとに生成される1つのアイテムを理論的に得ることを意味します。それは彼らがバックエンドからどれくらい早く出てくるかです。 –
ほとんどすべての命令がEXECUTEに1クロックかかる場合は、キャッシュミスを介して比較的遅い時間にフェッチするのに15~1000クロックかかることがありますが、他のすべてのステップはパイプラインには影響しませんが、パイプラインの1ステップ分に1クロックかかる。その後、レジスタや低速メモリなどの結果を保存して、次のものをすべて保存してください。 –