为什么我们需要在吞吐量测试之前预热缓存以及如何进行。数据集是否足够大,是否预热缓存没有意义。 举个例子,为什么CSAPP预热中的代码mountain.c会缓存两次。一个在真实测试部分之前的主循环中,另一个在真实测试部分中。 整个代码可以从http://csapp.cs.cmu.edu/3e/code.html
下载在主循环中,对缓存进行一次预热,这是测试方法
test(elems, stride); /* Warm up the cache */ //line:mem:warmup
cycles = fcyc2(test, elems, stride, 0); /* Call test(elems,stride) */ //line:mem:fcyc
return (size / stride) / (cycles / Mhz); /* Convert cycles to MB/s */ //line:mem:bwcompute
}
在fcyc2的实现中,缓存再次预热
if (compensate) {
do {
double cyc;
if (clear_cache)
clear();
f(param1, param2); /* warm cache */
start_comp_counter();
f(param1, param2);
cyc = get_comp_counter();
add_sample(cyc, k);
} while (!has_converged(k, epsilon, maxsamples) && samplecount < maxsamples);
} else {
do {
double cyc;
if (clear_cache)
clear();
f(param1, param2); /* warm cache */
start_counter();
f(param1, param2);
cyc = get_counter();
add_sample(cyc, k);
} while (!has_converged(k, epsilon, maxsamples) && samplecount < maxsamples);
}