[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
質問
科学的なアプリケーションで数値の最適化を行っています。一つ気づいたことは、GCCは以下の呼び出しを最適化することです。
pow(a,2)
にコンパイルすることで
a*a
が、呼び出しの
pow(a,6)
は最適化されておらず、実際にはライブラリ関数
pow
このため、パフォーマンスが大幅に低下します。(これに対して
インテル® C++ コンパイラー
は、実行可能な
icc
のライブラリ呼び出しが不要になります。
pow(a,6)
.)
気になるのは、置き換えを行った際に
pow(a,6)
で
a*a*a*a*a*a
GCC 4.5.1、オプション " を使用しています。
-O3 -lm -funroll-loops -msse4
を使用する場合、5
mulsd
という命令があります。
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
と書く一方で
(a*a*a)*(a*a*a)
を生成します。
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm13, %xmm13
で、乗算命令数を3個に減らすことができます。
icc
も同様の動作をします。
なぜコンパイラはこの最適化のトリックを認識しないのでしょうか?
解決方法は?
なぜなら 浮動小数点演算は連想演算ではない . 浮動小数点演算のオペランドをグループ化する方法は、答えの数値精度に影響を及ぼします。
そのため、ほとんどのコンパイラーは、答えが変わらないことが確実な場合や、数値の精度を気にしないと言われない限り、浮動小数点演算の並べ替えには非常に保守的になっています。 例えば
その
-fassociative-math
オプション
は、gcc が浮動小数点演算を再割り当てできるようにするもので、あるいは
-ffast-math
オプションを使用すると、精度と速度のトレードオフをより積極的に行うことができます。
関連
-
[解決済み] g++ 出力: ファイルが認識されません。ファイル形式が認識されない
-
[解決済み] gccのオプションにある-m32、-m64、nothingの違いは何ですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] 通貨を表すのにDoubleやFloatを使ってはいけないのですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み] GCC -fPIC オプション
-
[解決済み] なぜGCCは、速度の代わりにサイズに最適化すると、15-20%速いコードを生成するのですか?
-
[解決済み】すべてのgcc警告を無効にする
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ファイル形式が認識されない。GCCを使用してリンカスクリプトとして扱う
-
[解決済み] gcc エラー : `itoa' への未定義の参照
-
[解決済み] .ascizと.stringアセンブラディレクティブの違いは何ですか?
-
[解決済み] OSX 10.9にXcodeをインストール - clang: エラー: 入力ファイルがありません。
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] [解答】定数0.0039215689は何を表すか?
-
[解決済み】GCCのプリプロセッサー定義のダンプ
-
[解決済み] ビルドターゲットの外にgccのデバッグシンボルを生成する方法は?
-
[解決済み] gccのffast-mathは実際に何をするのですか?
-
[解決済み] ライブラリを静的にリンクするようにgccに直接指示する