私は多くの場所で読み、多くのチャートで、整数プログラムよりも浮動小数点プログラムの方が分岐予測がうまく機能することを確認しました。どうしてこれなの?それについてどこで読むべきかについての提案はありますか?
ありがとう!
私は多くの場所で読み、多くのチャートで、整数プログラムよりも浮動小数点プログラムの方が分岐予測がうまく機能することを確認しました。どうしてこれなの?それについてどこで読むべきかについての提案はありますか?
ありがとう!
この事実を指摘した多くの論文があるはずです。例: 動的分岐予測のスキームとパフォーマンス13-14ページ
図14および図15に示すように、浮動小数点プログラムは整数プログラムよりも条件分岐の割合が低くなりますが、取得される条件分岐の割合は高くなります。これは、これらの浮動小数点プログラムが多くの長いループ構造を持っているためです。
このペーパーには、SpecIntとSpecFp(2セットのコンピューターベンチマークプログラム)、整数セットと浮動小数点セットに関する統計もあります。少し時代遅れですが、まだいくつかの実際のコードが含まれています。
他の論文、例えばこれは、OOP(整数タスクと見なされることが多い)は間接的な分岐であると述べています:
オブジェクト指向言語では、間接分岐がはるかに頻繁に発生します。これらの言語は、サブルーチン呼び出しの遅延バインディングがクリーンなモジュラーコード設計の主要な手段である、よりポリモーフィックなプログラミングスタイルを促進します。ほとんどのC++およびJavaコンパイラに最適な実装である仮想関数テーブルは、すべてのポリモーフィック呼び出しに対して間接分岐を実行します。ここで学習したC++プログラムは、50命令ごとに1回の頻度で間接分岐を実行します。他の研究[CGZ94]も同様の結果を示しています。Javaプログラム(すべての非静的呼び出しが仮想である場合)は、間接呼び出しをさらに頻繁に使用する可能性があります。
浮動小数点プログラムは通常、配列指向であると思います。すべての配列の要素に対して共通コードのループをいくつか実行します。計算代数は、近くの要素にアクセスする際に静的パターンを使用することがよくあります(たとえば、[x][y]を計算するために必要なのは[x-1][y]と[x-1][y-1]のみです)。
整数プログラムは、多くのポインタを持つ複雑なデータ構造に関するものです。すべてのポインタートラバーサルにはいくつかの条件付きコードがあります(NULLをチェックし、次の反復への条件付きjmp)。データ間の依存関係は複雑または動的です。整数コードが画像などの巨大なint配列で機能する場合でも、アンダーオーバーフローとオーバーフローで飽和する条件付きコードが存在する可能性があります。配列の並べ替えも多くの分岐です。