問題タブ [fma]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 単純な計算と比較した FMA のパフォーマンス
fma()
FMA のパフォーマンス ( in math.h
) と単純な乗算および浮動小数点演算の加算を比較しようとしています。テストは簡単です。繰り返し回数が多い場合は、同じ計算を繰り返します。正確な検査のために達成しなければならないことが2つあります。
- 時間のカウントに他の計算を含めるべきではありません。
- 単純な乗算と加算は FMA に最適化されるべきではありません
- 反復は最適化されるべきではありません。つまり、反復は意図したとおりに正確に実行する必要があります。
上記のことを達成するために、私は次のことを行いました:
- 関数はインラインで、必要な計算のみが含まれています。
- 乗算を最適化しないようにg++
-O0
オプションを使用しました。(しかし、ダンプファイルを調べると、両方でほぼ同じコードが生成されるようです) - 使用済み
volatile
。
fma()
しかし、結果はほとんど違いがないか、単純な乗算と加算に比べてさらに遅くなります。意図したとおりの結果ですか (つまり、速度の点で実際に違いはありません)、それとも何か間違ったことをしていますか?
仕様
- Ubuntu 14.04.2
- G++ 4.8.2
- Intel(R) Core(TM) i7-4770 (3.4GHz、8MB L3キャッシュ)
マイコード
simd - デノーマルを生成する Haswell FMA 命令
Intel Haswell CPU の FMA 命令を使用して、一部の計算を最適化しています。
しかし、MXCSR レジスターを DNZ および FTZ モードに設定しても、これらの命令がデノーマルを生成していることがわかりました。
これらの FMA 命令に、デノーマルではなく 0 を生成させるにはどうすればよいですか?
単精度浮動小数点データを扱っています。
c++ - MSVC で FMA 命令を自動的に生成する
MSVC は何年も前から AVX/AVX2 命令をサポートしており、この msdn ブログ投稿によると、融合乗算加算 (FMA)命令を自動的に生成できます。
ただし、次の関数はいずれも FMA 命令にコンパイルされません。
さらに悪いことに、std::fma は単一の FMA 命令として実装されておらず、プレーンよりもはるかに遅く実行x * y + z
されます (実装が FMA 命令に依存していない場合、std::fma のパフォーマンスの低下が予想されます)。
/arch:AVX2 /O2 /Qvec
フラグでコンパイルします。も試してみましたが/fp:fast
、成功しませんでした。
問題は、MSVC に FMA 命令を自動的に発行させるにはどうすればよいかということです。
アップデート
#pragma fp_contract (on|off)
(のように見える) 何もしない があります。