floatよりdoubleの方が速い?
質問
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 回ですが (データ依存)、divss
は8〜18サイクルのスループット。 (数値は
https://agner.org/optimize/
. 遅延は除算のスループットと相関がありますが、スループットの数値よりも高くなっています)。
は
fdiv
のような多くのライブラリ関数のバージョンは
float
と
logf(float)
も速くなります。
よりも
sinf(float)
と
log(double)
は、正しい精度を得るためのビット数が少ないからです。 の完全な精度を得るために、より少ない項で多項式近似を使用することができます。
sin(double)
vs.
float
しかし 各数値に対して2倍のメモリを消費することは、明らかに キャッシュへの負荷が高く、より多くのメモリ帯域幅を必要とします。 浮動小数点演算のパフォーマンスを気にするのは、次のことを行っているときです。 ロット であるため、メモリとキャッシュの考慮は非常に重要です。
@Richard の回答は、FP 操作を実行する他の方法もあることを指摘しています ( SSE / SSE2 命令、古き良き MMX は整数値のみ)、特に多くのデータに対する単純な演算("SIMD" 単一命令/複数データ)に適しており、以下のような特徴があります。 各ベクトルレジスタは4つの単精度浮動小数点または2つの倍精度浮動小数点だけをパックすることができます。 であるため、この効果はより顕著になります。
最終的にはベンチマークを行う必要がありますが、私の予想では、妥当な (すなわち, 大きい ) ベンチマークでは、単精度にこだわることの利点を見出すことができると思います (もちろん、次のようなことはしないと仮定しています。 は必要ないとして 精度の余分なビットを必要としないと仮定してください)。
関連
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] <は<=より速いのか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] floatとdoubleの違いは何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】Enterキーを押して続行する
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] 浮動小数点数除算と浮動小数点数乗算の比較
-
[解決済み] GCC/clangのアセンブリ出力から "ノイズ "を取り除くには?