【问题标题】:Determining size of processor cache in pure Java在纯 Java 中确定处理器缓存的大小
【发布时间】:2013-07-28 07:52:47
【问题描述】:

我正在用纯 Java 微调一个数值算法,该算法对每核处理器缓存的大小非常敏感:当工作数据集适合 L1 缓存时,它的运行速度明显更快。

显然,我可以通过一些基准测试为我的本地机器微调它。但理想情况下,我希望能够根据正在使用的处理器的 L1 缓存大小自动调整工作集的大小。

本机代码不是一个选项:用 Java 编写这个算法的全部目的是让它独立于平台!

纯Java中是否有可靠确定每核缓存大小的好方法?

【问题讨论】:

  • 运行一组基准测试并分析响应曲线:)

标签: java performance cpu-cache


【解决方案1】:

如果使用一组参数时它的运行速度明显快于另一组参数,那么我会根据注意到的差异来调整它。在开始进行大量计算之前(我假设是这种情况,否则您不会关心),运行具有各种不同大小的内部数据存储的较小集合。 (我假设算法可以像这样在数值上进行调整。)

这样一来,差异来自 L1 缓存大小、L1 + L2 缓存大小或完全是其他什么都无关紧要 - 您将选择最适合当前情况的内容。

您需要注意 JIT 预热期,就像在正常的基准测试中一样,但我认为这是创建通用优化方法的好方法,即使它最终碰巧最重视 L1 缓存。

您可能会将其作为单独的安装时工作,将结果写入配置文件,以便在后续运行时避免额外的工作。 (您可能需要一种重新运行调整步骤的方法,以防处理器发生变化或其他情况。)

【讨论】:

  • visualvm 和 Windows Vista 采用相同的策略,举两个随机例子。
  • 自动安装时间基准测试是一个可行的有趣想法。尽管基于实际的缓存大小,我仍然希望有一个像样的启发式方法 - 知道这是否可能吗?
  • @mikera:你可以试试 JMX——这是我得到的最好的建议,超出了我的答案。
【解决方案2】:
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

【讨论】:

  • 不要将链接发布为答案,而是添加一些文本来解释此答案如何帮助 OP 解决当前问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 2017-03-17
  • 2013-08-14
  • 1970-01-01
  • 2010-11-22
  • 2019-10-02
  • 2010-09-25
  • 2010-12-18
相关资源
最近更新 更多