4
役に立たないMOV命令を導入すると、x86_64アセンブリでタイトなループが加速するのはなぜですか?
バックグラウンド: 組み込みアセンブリ言語を使用して一部のPascalコードを最適化しているときに、不要なMOV命令に気づき、それを削除しました。 驚いたことに、不要な命令を削除すると、プログラムの速度が低下しました。 任意の、役に立たないMOV命令を追加すると、パフォーマンスがさらに向上することがわかりました。 効果は不安定で、実行順序に基づいて変化します。同じジャンク命令が1行で上または下に転置されると、速度が低下します。 CPUがあらゆる種類の最適化と合理化を行うことを理解していますが、これはより黒魔術のように見えます。 データ: 私のコードのバージョンは、時間を実行するループの途中で3つのジャンク操作を条件付きでコンパイルします2**20==1048576。(周囲のプログラムはSHA-256ハッシュを計算するだけです)。 私のかなり古いマシン(Intel(R)Core(TM)2 CPU 6400 @ 2.13 GHz)での結果: avg time (ms) with -dJUNKOPS: 1822.84 ms avg time (ms) without: 1836.44 ms プログラムはループで25回実行され、実行順序は毎回ランダムに変化しました。 抜粋: {$asmmode intel} procedure example_junkop_in_sha256; var s1, t2 : uint32; begin // Here are parts of the SHA-256 algorithm, in Pascal: // …