uOP$ に乗ってるかどうかの違いなんじゃないの、と指摘されました。uOP$ のことすっかり忘れてました。Sandy Bridge の uOP$ の解説記事はこんなのがあります(英語)

  • uOP$ に乗っている場合、命令デコーダを動かさずに直接 uOP を高速に後段に供給できる。この時、スループットは実行ユニットの構成(実行ポート数とか実行ユニット単体でのスループットとか)によって制限される。
  • uOP$ に乗っていない場合、命令デコーダを動かすことになるが、複雑な(= 複数 uOP になる) and/or 使用頻度があまり高くない命令は 1命令/クロック でしかデコードできない(デコードする回路が無い)。そのためスループットは 1 が限界となる。
  • (ここは推測) pshufb は使用頻度が高いので1クロックで複数命令デコードできるように作ってあるが、pmovzxbw はそうではないので1命令デコードなのでは?

と考えるとうまく説明できそうです(でも推測の部分はどうやって検証しますかね?)。ちなみに Sandy Bridge の uOP$ は最大で 1.5K uOPs らしいのですが、キャッシュの構造上きっちり uOP で満たすことができるとは限らない(らしい)ので、ループ内の命令が 1K を超えたあたりから徐々に遅くなる(uOP$ に乗らなくなる)ようです。

…これ、uOP$ に乗っている/いない で2回計測する必要があるってことなのかしら?

Trackback

no comment untill now

Add your comment now