18

多くの SSE "mov" 命令は、浮動小数点値を移動することを指定します。例えば:

  • MOVHLPS - パックド単精度浮動小数点値の上位から下位への移動
  • MOVSD—スカラー倍精度浮動小数点値の移動
  • MOVUPD - アラインされていないパックド倍精度浮動小数点値の移動

これらの命令は、単に 32 ビットまたは 64 ビットの値を移動すると述べていないのはなぜですか? ビットを動かしているだけなら、なぜ命令は浮動小数点値用であると指定しているのでしょうか? これらのビットを浮動小数点として解釈するかどうかに関係なく、それらは機能するのでしょうか?

4

2 に答える 2

16

答えを見つけたと思います。一部のマイクロアーキテクチャは、整数命令とは異なる実行ユニットで浮動小数点命令を実行します。命令のストリームが同じ「ドメイン」(整数または浮動小数点) 内にとどまると、全体的なレイテンシが向上します。これについては、Agner Fog の最適化マニュアルの「データ バイパスの遅延」というタイトルのセクションでかなり詳しく説明されています: http://www.agner.org/optimize/microarchitecture.pdf

私はこの同様の SO の質問でこの説明を見つけました: MOVDQA と MOVAPS x86 命令の違い?

于 2013-04-30T07:20:28.063 に答える
4

誰かが気になる場合に備えて、これがまさに Agner Fog の vectorclass で、boolean float (Vec4fb) と boolean integer (Vec4i) http://www.agner.org/optimize/#vectorclassで使用する個別のベクトル クラスを持っている理由です。

彼のマニュアルで彼は書いています。「浮動小数点ベクトルで使用する別のブール ベクトル クラスを定義した理由は、より高速なコードを生成できるようにするためです。(最近の多くの CPU には、整数ベクトルと浮動小数点ベクトル用に別の実行ユニットがあります。実行できる場合もあります。浮動小数点ユニットでブール演算を実行することで、2 つのユニット間でデータを移動する際の遅延を回避できます)。」

SSE と AVX に関するほとんどの質問は、彼のマニュアルを読んで、さらに重要なことに彼の vectorclass のコードを見ることで解決できます。

于 2013-05-02T08:08:17.090 に答える