如何用Java收集AMD CPU缓存命中率?

时间:2012-10-08 20:08:51

标签: java caching amd-processor

我正在用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;
}
BTW,INDEX数组以随机顺序包含DATA数组的索引以防止预取。我正在使用INDEX数组中的随机索引强制所有缓存访问错过

现在,我想通过收集有关其命中率的信息来检查CPU缓存的行为。

是否有用于此目的的开发工具?如果不是有任何技术吗?

2 个答案:

答案 0 :(得分:1)

我认为你不能从Java那里获得如此低级别的信息,但有些人可能会更清楚。您可以编写相同的程序,没有缓存未命中并检查差异。这就是我在this other post中建议的例子。

答案 1 :(得分:1)

在Linux上,可以通过OProfile收集此类信息。每个CPU都有性能事件计数器。请参阅此处获取AMD K15系列活动列表:http://oprofile.sourceforge.net/docs/amd-family15h-events.php

OProfile定期对事件计数器进行采样,并与程序计数器一起进行采样。程序运行后,您可以分析发生的事件数量和(统计上)程序位置。

OProfile内置了Java支持。它与Java JIT交互并创建一个合成符号表,以查找生成的JIT代码的Java方法名称。

初始设置并不容易。如果有兴趣,我可以引导您完成或写一些关于它的内容。