我试图在多处理器环境中在总线上生成各种类型的数据强度。基本上我需要两种模式 - 总线上的流量几乎可以忽略不计,总线上的流量非常高。最初我在考虑访问寄存器而不是将它们写回缓存/主存储器以产生低总线流量。但我对这个想法并不十分肯定。此外,我正在使用Java编写代码。
任何提示如何做到这一点?
架构:x86_64
编辑:我有以下代码段。
mutex.lock();
try{
// Generate Bus traffic
}
finally{
mutex.unlock();
}
对于每个主题,我都试图在关键部分中生成流量。
答案 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;