L3CPU缓存java基准测试显示奇怪的结果
读完这篇文章后,我决定在笔记本电脑上查看。其思想是创建大小为[1..40]Mb的数组,然后在其上迭代1024次(例如,对于大小为1的数组,步长为1024,对于大小为2 Mb的数组,步长为2048等等)。我的代码是:L3CPU缓存java基准测试显示奇怪的结果,java,caching,memory,jvm,cpu-cache,Java,Caching,Memory,Jvm,Cpu Cache,读完这篇文章后,我决定在笔记本电脑上查看。其思想是创建大小为[1..40]Mb的数组,然后在其上迭代1024次(例如,对于大小为1的数组,步长为1024,对于大小为2 Mb的数组,步长为2048等等)。我的代码是: public class L3CacheBenchmark { @State(Scope.Benchmark) public static class P { @Param({ "1", "2", "3
public class L3CacheBenchmark {
@State(Scope.Benchmark)
public static class P {
@Param({
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
"31", "32", "33", "34", "35", "36", "37", "38", "39", "40",
})
public int size;
}
@State(Scope.Thread)
public static class ThreadData {
byte[] array;
int len;
@Setup
public void setup(P p) {
array = new byte[p.size * 1024 * 1024];
len = array.length;
}
}
@Benchmark
public byte[] testMethod(ThreadData data) {
int step = (data.len / 1024) - 1;
for (int k = 0; k < data.len; k += step) {
data.array[k] = 1;
}
return data.array;
}
}
正如您所看到的,吞吐量是不同的,最显著的区别是大小倍数为8的阵列:速度下降几乎是4倍。此外,例如,大小为37 Mb的阵列的速度几乎是38 Mb阵列的两倍。对于我的发现,我没有找到任何合乎逻辑的解释
附加Cpu i7 4700mq 6 Mb缓存:
是什么导致了这种行为?您正在观察这种行为的影响 您的CPU每个核心有256 KB的8路集关联二级缓存。它最多可以存储256 KB/64缓存线,其中不超过8行具有相同的索引位 基准循环写入1025个不同的地址。但是,根据跨距的不同,这些地址可能会落入少量的集合中,从而导致冲突和从缓存中逐出。这正是在您的情况下,当步幅(step)=819116324575等时发生的情况 要验证此理论,请使用
-prof perfnorm
选项重新运行JMH基准测试。以下是size=8和size=9的统计信息:
L3CacheBenchmark.testMethod:CPI 8 thrpt 1.173 #/op
L3CacheBenchmark.testMethod:L1-dcache-load-misses 8 thrpt 1048.088 #/op
L3CacheBenchmark.testMethod:L1-dcache-loads 8 thrpt 1073.767 #/op
L3CacheBenchmark.testMethod:L1-dcache-store-misses 8 thrpt 1049.491 #/op
L3CacheBenchmark.testMethod:L1-dcache-stores 8 thrpt 1060.069 #/op
L3CacheBenchmark.testMethod:L1-icache-load-misses 8 thrpt 1.209 #/op
L3CacheBenchmark.testMethod:LLC-load-misses 8 thrpt 0.082 #/op
L3CacheBenchmark.testMethod:LLC-loads 8 thrpt 1.399 #/op
L3CacheBenchmark.testMethod:LLC-store-misses 8 thrpt 0.077 #/op
L3CacheBenchmark.testMethod:LLC-stores 8 thrpt 1035.877 #/op
L3CacheBenchmark.testMethod:branch-misses 8 thrpt 1.234 #/op
L3CacheBenchmark.testMethod:branches 8 thrpt 2096.674 #/op
L3CacheBenchmark.testMethod:cycles 8 thrpt 13520.964 #/op
L3CacheBenchmark.testMethod:dTLB-load-misses 8 thrpt 0.057 #/op
L3CacheBenchmark.testMethod:dTLB-loads 8 thrpt 1086.355 #/op
L3CacheBenchmark.testMethod:dTLB-store-misses 8 thrpt 0.020 #/op
L3CacheBenchmark.testMethod:dTLB-stores 8 thrpt 1068.579 #/op
L3CacheBenchmark.testMethod:iTLB-load-misses 8 thrpt 0.044 #/op
L3CacheBenchmark.testMethod:iTLB-loads 8 thrpt 0.018 #/op
L3CacheBenchmark.testMethod:instructions 8 thrpt 11530.742 #/op
L3CacheBenchmark.testMethod:stalled-cycles-backend 8 thrpt 8315.437 #/op
L3CacheBenchmark.testMethod:stalled-cycles-frontend 8 thrpt 10359.447 #/op
L3CacheBenchmark.testMethod:CPI 9 thrpt 0.871 #/op
L3CacheBenchmark.testMethod:L1-dcache-load-misses 9 thrpt 1055.973 #/op
L3CacheBenchmark.testMethod:L1-dcache-loads 9 thrpt 1068.958 #/op
L3CacheBenchmark.testMethod:L1-dcache-store-misses 9 thrpt 1045.480 #/op
L3CacheBenchmark.testMethod:L1-dcache-stores 9 thrpt 1057.328 #/op
L3CacheBenchmark.testMethod:L1-icache-load-misses 9 thrpt 1.108 #/op
L3CacheBenchmark.testMethod:LLC-load-misses 9 thrpt 0.174 #/op
L3CacheBenchmark.testMethod:LLC-loads 9 thrpt 0.304 #/op
L3CacheBenchmark.testMethod:LLC-store-misses 9 thrpt 0.045 #/op
L3CacheBenchmark.testMethod:LLC-stores 9 thrpt 0.350 #/op
L3CacheBenchmark.testMethod:branch-misses 9 thrpt 1.072 #/op
L3CacheBenchmark.testMethod:branches 9 thrpt 2099.846 #/op
L3CacheBenchmark.testMethod:cycles 9 thrpt 10041.724 #/op
L3CacheBenchmark.testMethod:dTLB-load-misses 9 thrpt 0.086 #/op
L3CacheBenchmark.testMethod:dTLB-loads 9 thrpt 1073.633 #/op
L3CacheBenchmark.testMethod:dTLB-store-misses 9 thrpt 0.045 #/op
L3CacheBenchmark.testMethod:dTLB-stores 9 thrpt 1054.587 #/op
L3CacheBenchmark.testMethod:iTLB-load-misses 9 thrpt 0.044 #/op
L3CacheBenchmark.testMethod:iTLB-loads 9 thrpt 0.037 #/op
L3CacheBenchmark.testMethod:instructions 9 thrpt 11529.996 #/op
L3CacheBenchmark.testMethod:stalled-cycles-backend 9 thrpt 3439.278 #/op
L3CacheBenchmark.testMethod:stalled-cycles-frontend 9 thrpt 6888.714 #/op
最值得注意的是,大小为8的LLC存储区与大小为9的LLC存储区之间存在差异:1035。这意味着所存储的数据不适合二级缓存,而是进入三级缓存
顺便说一句,您的基准测试无法衡量L3缓存的效果,因为它只涉及少量数据(约64KB)。为了进行公平测试,您需要读取和写入分配数组的整个范围。您有问题吗?问题大概是“是什么导致了这种行为?”。您应该通过
perf stat
运行有趣的案例,并对它们进行比较。在笔记本电脑上,你可能应该确保CPU以固定的时钟速率运行,热节流可能会导致不一致的基准测试结果。感谢@OliverCharlesworth,我补充了这个问题。这么大的一步,你几乎不需要检查缓存,只需要在每个级别上强调几组。TLB/页面漫游很可能会成为您的瓶颈,因为您几乎每次访问都需要一个新页面。你也没有加热缓存,所以结果毫无意义。Sergey Kuksenko做了一个很棒的演示-。演示5正是关于类似的问题。谢谢,在本演示中有很多东西需要修改。
L3CacheBenchmark.testMethod:CPI 8 thrpt 1.173 #/op
L3CacheBenchmark.testMethod:L1-dcache-load-misses 8 thrpt 1048.088 #/op
L3CacheBenchmark.testMethod:L1-dcache-loads 8 thrpt 1073.767 #/op
L3CacheBenchmark.testMethod:L1-dcache-store-misses 8 thrpt 1049.491 #/op
L3CacheBenchmark.testMethod:L1-dcache-stores 8 thrpt 1060.069 #/op
L3CacheBenchmark.testMethod:L1-icache-load-misses 8 thrpt 1.209 #/op
L3CacheBenchmark.testMethod:LLC-load-misses 8 thrpt 0.082 #/op
L3CacheBenchmark.testMethod:LLC-loads 8 thrpt 1.399 #/op
L3CacheBenchmark.testMethod:LLC-store-misses 8 thrpt 0.077 #/op
L3CacheBenchmark.testMethod:LLC-stores 8 thrpt 1035.877 #/op
L3CacheBenchmark.testMethod:branch-misses 8 thrpt 1.234 #/op
L3CacheBenchmark.testMethod:branches 8 thrpt 2096.674 #/op
L3CacheBenchmark.testMethod:cycles 8 thrpt 13520.964 #/op
L3CacheBenchmark.testMethod:dTLB-load-misses 8 thrpt 0.057 #/op
L3CacheBenchmark.testMethod:dTLB-loads 8 thrpt 1086.355 #/op
L3CacheBenchmark.testMethod:dTLB-store-misses 8 thrpt 0.020 #/op
L3CacheBenchmark.testMethod:dTLB-stores 8 thrpt 1068.579 #/op
L3CacheBenchmark.testMethod:iTLB-load-misses 8 thrpt 0.044 #/op
L3CacheBenchmark.testMethod:iTLB-loads 8 thrpt 0.018 #/op
L3CacheBenchmark.testMethod:instructions 8 thrpt 11530.742 #/op
L3CacheBenchmark.testMethod:stalled-cycles-backend 8 thrpt 8315.437 #/op
L3CacheBenchmark.testMethod:stalled-cycles-frontend 8 thrpt 10359.447 #/op
L3CacheBenchmark.testMethod:CPI 9 thrpt 0.871 #/op
L3CacheBenchmark.testMethod:L1-dcache-load-misses 9 thrpt 1055.973 #/op
L3CacheBenchmark.testMethod:L1-dcache-loads 9 thrpt 1068.958 #/op
L3CacheBenchmark.testMethod:L1-dcache-store-misses 9 thrpt 1045.480 #/op
L3CacheBenchmark.testMethod:L1-dcache-stores 9 thrpt 1057.328 #/op
L3CacheBenchmark.testMethod:L1-icache-load-misses 9 thrpt 1.108 #/op
L3CacheBenchmark.testMethod:LLC-load-misses 9 thrpt 0.174 #/op
L3CacheBenchmark.testMethod:LLC-loads 9 thrpt 0.304 #/op
L3CacheBenchmark.testMethod:LLC-store-misses 9 thrpt 0.045 #/op
L3CacheBenchmark.testMethod:LLC-stores 9 thrpt 0.350 #/op
L3CacheBenchmark.testMethod:branch-misses 9 thrpt 1.072 #/op
L3CacheBenchmark.testMethod:branches 9 thrpt 2099.846 #/op
L3CacheBenchmark.testMethod:cycles 9 thrpt 10041.724 #/op
L3CacheBenchmark.testMethod:dTLB-load-misses 9 thrpt 0.086 #/op
L3CacheBenchmark.testMethod:dTLB-loads 9 thrpt 1073.633 #/op
L3CacheBenchmark.testMethod:dTLB-store-misses 9 thrpt 0.045 #/op
L3CacheBenchmark.testMethod:dTLB-stores 9 thrpt 1054.587 #/op
L3CacheBenchmark.testMethod:iTLB-load-misses 9 thrpt 0.044 #/op
L3CacheBenchmark.testMethod:iTLB-loads 9 thrpt 0.037 #/op
L3CacheBenchmark.testMethod:instructions 9 thrpt 11529.996 #/op
L3CacheBenchmark.testMethod:stalled-cycles-backend 9 thrpt 3439.278 #/op
L3CacheBenchmark.testMethod:stalled-cycles-frontend 9 thrpt 6888.714 #/op