3

私はJavaでプログラムを書いています

このプログラムでは、データの配列を読み取って変更しています。これはコードの例です:

public double computation() {
    char c = 0;
    char target = 'a';
    int x = 0, y = 1;

    for (int i = 0; i < data.length; i++) {
        // Read Data
        c = data[index[i]];

        if (c == target)
            x++;
        else
            y++;

        //Change Value
        if (Character.isUpperCase(c))
            Character.toLowerCase(c);
        else
            Character.toUpperCase(c);

        //Write Data
        data[index[i]] = c;
    }
    return (double) x / (double) y;
}

ところで、INDEX配列には、プリフェッチを防ぐためにランダムな順序でDATA配列のインデックスが含まれています。INDEX配列でランダムインデックスを使用して、すべてのキャッシュアクセスを強制的に見逃しています。

次に、ヒット率に関する情報を収集して、CPUキャッシュの動作を確認します。

この目的のために開発されたツールはありますか?そうでない場合、何かテクニックはありますか?

4

2 に答える 2

1

Javaからこのような低レベルの情報に到達できるとは思いませんが、誰かがもっとよく知っているかもしれません。キャッシュミスなしで同じプログラムを作成し、違いを確認することができます。これは、たとえばこの他の投稿で私が提案したものです。

于 2012-10-08T20:12:38.750 に答える
1

Linuxでは、 OProfileを介してそのような情報を収集することが可能です。各CPUには、パフォーマンスイベントカウンターがあります。AMD K15ファミリーイベントのリストについては、こちらをご覧ください:http: //oprofile.sourceforge.net/docs/amd-family15h-events.php

OProfileは、定期的にイベントカウンターをサンプリングし、プログラムカウンターと一緒にサンプリングします。プログラムの実行後、発生するイベントの数と(統計的に)どのプログラム位置で発生するかを分析できます。

OProfileにはJavaサポートが組み込まれています。これは、Java JITと対話し、合成シンボルテーブルを作成して、生成されたJITコードの平和のためにJavaメソッド名を検索します。

初期設定は簡単ではありません。興味があれば、私はあなたを案内するか、それについてもう少し書くことができます。

于 2014-11-18T08:29:49.760 に答える