gpt4 book ai didi

java - 关于缓存行填充的困惑

转载 作者:行者123 更新时间:2023-12-02 11:45:52 25 4
gpt4 key购买 nike

我读过一篇关于缓存行填充的文章,网址是: https://mechanical-sympathy.blogspot.com/2011/07/false-sharing.html

它有一个这样的示例:

public final class FalseSharing implements Runnable {
public final static int NUM_THREADS = 4; // change
public final static long ITERATIONS = 500L * 1000L * 1000L;
private final int arrayIndex;

private static VolatileLong[] longs = new VolatileLong[NUM_THREADS];
static {
for (int i = 0; i < longs.length; i++) {
longs[i] = new VolatileLong();
}
}

public FalseSharing(final int arrayIndex) {
this.arrayIndex = arrayIndex;
}

public static void main(final String[] args) throws Exception {
final long start = System.nanoTime();
runTest();
System.out.println("duration = " + (System.nanoTime() - start));
}

private static void runTest() throws InterruptedException {
Thread[] threads = new Thread[NUM_THREADS];

for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(new FalseSharing(i));
}

for (Thread t : threads) {
t.start();
}

for (Thread t : threads) {
t.join();
}
}

public void run() {
long i = ITERATIONS + 1;
while (0 != --i) {
longs[arrayIndex].value = i;
}
}

public final static class VolatileLong {
public volatile long value = 0L;
public long p1, p2, p3, p4, p5, p6; // comment out
}
}

问题1:如果我想避免错误共享,我应该确保VolatileLong对象是64字节,long值0L是8字节,p1,p2,p3,p4,p5,p6是48字节,那么剩下的8字节到底是多少?

问题2:我执行了这个程序,结果是:22951146607如果我删除 VolatileLong 中的变量 p6,结果是:19457942328,它比 p6 少,而没有 p6 应该会遭受错误共享。当然,每次的结果都不同,但通常使用p6的时间比不使用p6的时间多,这并没有显示出缓存行填充的优势。

最佳答案

看起来 VolatileLong 中缺少的额外 8 个字节由 object header 占用。 。因此,VolatileLong 的完整大小为 64 字节,即使源代码中仅可见 56 字节。

最后,使用适当的 micro benchmark harness 执行测试会更有效。以获得可靠的结果。

关于java - 关于缓存行填充的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48207739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com