1. ホーム
  2. c++

floatよりdoubleの方が速い?

2023-11-19 08:39:56

質問

Double 値はより高い精度で保存され、float の 2 倍のサイズですが、Intel CPU は float に最適化されているのでしょうか?

つまり、+、-、*、および / のための倍数演算は、float 演算と同じかより高速ですか?

64ビットアーキテクチャの場合、答えは変わるのでしょうか?

どのように解決するのですか?

特にどの演算が他に対して最適化されているかという点では、単一の "intel CPU" はありません!しかし、それらのほとんどは、CPU レベル (具体的には FPU 内) で、ご質問に対する回答がそのようなものであることを示しています。

二重演算は float 演算と同じかそれ以上に高速です。 は float 演算と同じかより速いですか? *と/は同じかそれより速いですか?

は "yes"です -- 。 CPUの中で ただし、division と sqrt は にはやや遅いです。 double よりも float . (すべての x86-64 コンパイラがそうで、オプションによっては 32 ビットコンパイラもそうであるように、コンパイラがスカラー FP 数学に SSE2 を使用すると仮定しています。 レガシー x87 ではレジスタの幅が異なるのではなく、メモリの幅が異なるだけなので (ロード/ストア時に変換される)、歴史的に sqrt や除算でさえも double ).

たとえば、Haswell は divsd のスループットは 8 ~ 14 サイクルに 1 回ですが (データ依存)、 (スカラー・シングル) のスループットは 7 サイクルに 1 回です。 divss は8〜18サイクルのスループット。 (数値は https://agner.org/optimize/ . 遅延は除算のスループットと相関がありますが、スループットの数値よりも高くなっています)。

fdiv のような多くのライブラリ関数のバージョンは floatlogf(float) も速くなります。 よりも sinf(float)log(double) は、正しい精度を得るためのビット数が少ないからです。 の完全な精度を得るために、より少ない項で多項式近似を使用することができます。 sin(double) vs. float


しかし 各数値に対して2倍のメモリを消費することは、明らかに キャッシュへの負荷が高く、より多くのメモリ帯域幅を必要とします。 浮動小数点演算のパフォーマンスを気にするのは、次のことを行っているときです。 ロット であるため、メモリとキャッシュの考慮は非常に重要です。

@Richard の回答は、FP 操作を実行する他の方法もあることを指摘しています ( SSE / SSE2 命令、古き良き MMX は整数値のみ)、特に多くのデータに対する単純な演算("SIMD" 単一命令/複数データ)に適しており、以下のような特徴があります。 各ベクトルレジスタは4つの単精度浮動小数点または2つの倍精度浮動小数点だけをパックすることができます。 であるため、この効果はより顕著になります。

最終的にはベンチマークを行う必要がありますが、私の予想では、妥当な (すなわち, 大きい ) ベンチマークでは、単精度にこだわることの利点を見出すことができると思います (もちろん、次のようなことはしないと仮定しています。 は必要ないとして 精度の余分なビットを必要としないと仮定してください)。