分岐動作を適切に予測する必要がある比較的単純な Java を調べているという珍しいケースがありますが、likwid-perfctr は非常に大きな (50%) 分岐予測ミス率を報告しています。ただし、ランタイムはその予測ミス率と一致していません (CPI は非常に低く、~0.3 であり、フロントエンドとバックエンドのストールは低いです)。同様の C++ プログラムでは、予測ミスはありませんが、実際には実行時間がわずかに長くなります。
不一致は、BR_MISP_RETIRED_ALL_BRANCHES と BR_MISP_EXEC_ANY イベントにあるようです。誤予測率の計算に使用される前者は大きく、ループごとに 1 つのイベントです。後者は非常に小さく、予想される誤予測率および実行時間と一致しています。
私が試した他のサンプル プログラムでは、重大な予測ミス (たとえば、配列内のランダムな値での分岐) が見られましたが、値は非常に似ていました。
これら2つのカウンターの正確な意味を知っている人はいますか? ブランチをリタイアする前に実行する必要がある場合、「リタイア」カウンターを「exec」カウンターよりも 25 倍大きくするにはどうすればよいですか?