2

コアあたりのプロセッサ キャッシュのサイズに非常に敏感なピュア Java の数値アルゴリズムを微調整しています。作業データ セットが L1 キャッシュ内に収まると、著しく高速に実行されます。

明らかに、少しベンチマークを行うことで、ローカル マシン用にこれを微調整できます。しかし、理想的には、使用されているプロセッサの L1 キャッシュのサイズに基づいて、ワーキング セットのサイズを自動的に調整できるようにしたいと考えています。

ネイティブ コードはオプションではありません。このアルゴリズムを Java で記述することの全体的なポイントは、プラットフォームに依存しないようにすることです。

純粋な Javaでコアごとのキャッシュのサイズを確実に決定する良い方法はありますか?

4

2 に答える 2

5

あるパラメータ セットで別のパラメータ セットよりも著しく高速に実行される場合は、その違いに注意して調整します。長い一連の計算を開始する前に (そうであると仮定しますが、それ以外の場合は気にしないでしょう)、さまざまなサイズの内部データ ストアを使用して、より小さなセットを実行します。(アルゴリズムはそのように数値的に調整できると仮定しています。)

そうすれば、違いが L1 キャッシュ サイズによるものなのか、L1 + L2 キャッシュ サイズによるものなのか、それともまったく別のものなのかは問題ではありません。目前の状況に最適なものを選択できます。

通常のベンチマークと同様に、JIT のウォームアップ期間に注意する必要がありますが、L1 キャッシュを最も重視する結果になっても、これは一般的な最適化アプローチを作成する良い方法だと思います。 .

これは、結果を構成ファイルに書き込む個別のインストール時の作業として潜在的に持つことができるため、その後の実行で余分な作業を避けることができます。(プロセッサが変更された場合などに備えて、おそらくチューニングステップを再実行する方法が必要になるでしょう。)

于 2013-07-28T13:14:43.287 に答える
0
public class CacheLine {
    public static void main(String[] args) {
        CacheLine cacheLine = new CacheLine();
        cacheLine.startTesting();
    }

    private void startTesting() {
        byte[] array = new byte[128 * 1024];
        for (int testIndex = 0; testIndex < 10; testIndex++) {
            testMethod(array);
            System.out.println("--------- // ---------");
        }

    }

    private void testMethod(byte[] array) {
        for (int len = 8192; len <= array.length; len += 8192) {

            long t0 = System.nanoTime();
            for (int i = 0; i < 10000; i++) {
                for (int k = 0; k < len; k += 64) {
                    array[k] = 1;
                }
            }

            long dT = System.nanoTime() - t0;
            System.out.println("len: " + len/1024 + " dT: " + dT + " dT/stepCount: " + (dT) / len);
        }
    }
}

このコードは、L1 データ キャッシュ サイズの決定に役立ちます。詳細については、こちらをご覧ください。 https://medium.com/@behzodbekqodirov/threading-in-java-194b7db6c1de#.kzt4w8eul

于 2016-07-10T14:35:30.370 に答える