在总线上生成各种数据强度

时间:2014-03-21 18:02:43

标签: java performance architecture multiprocessing bus

我试图在多处理器环境中在总线上生成各种类型的数据强度。基本上我需要两种模式 - 总线上的流量几乎可以忽略不计,总线上的流量非常高。最初我在考虑访问寄存器而不是将它们写回缓存/主存储器以产生低总线流量。但我对这个想法并不十分肯定。此外,我正在使用Java编写代码。

任何提示如何做到这一点?

架构:x86_64

编辑:我有以下代码段。

    mutex.lock();
    try{
        // Generate Bus traffic
    }
    finally{
        mutex.unlock();
    }

对于每个主题,我都试图在关键部分中生成流量。

1 个答案:

答案 0 :(得分:0)

访问寄存器会在总线上产生零流量(除非您的意思是某些CPU内部总线)。要在CPU内存总线上生成最大流量,只需读取大于最大缓存(通常为几兆字节的L3)的阵列。确保读取数据实际使用,以便DCE不会启动。

long[] data = new long[1<<24]; // 8 * 16MB
volatile long blackhole;

void saturateBus() {
    long sum = 0;
    for (long x : data) sum += x;
    blackhole = sum;
}

这应该在现代amd64架构上使内存总线饱和,因为循环可以在每个元素的1个周期内执行。假设有一些令人难以置信的快速内存,您可能需要像这样手动展开

    long sum0 = 0, sum1 = 0;
    for (int i=0; i<data.length; i+=2) { // assuming even `data.length`
        sum0 += data[i+0];
        sum1 += data[i+1];
    }
    blackhole = sum0 + sum1;