我试图测试我有权访问的计算机的缓存属性。要做到这一点,我正在尝试阅读记忆和时间。我改变工作集大小和跨步访问模式以获得不同的测量结果。控制海湾合作委员会优化
代码看起来像这样:
clock1 = get_ticks()
for (i = 0; i < 1000000; i++) {
for (j = 0; j < (workingset * stride/sizeof(data_t)); j += stride) {
*array[j];
}
}
clock2 = get_ticks()
现在的问题是,有一个合理的优化级别,GCC将优化出来读,因为它没有副作用。我不能没有优化级别,否则所有循环变量都会导致读取到内存。我已经尝试了一些不同的东西,比如使数组变为volatile,并且使用内联函数来将其转换为volatile,但gcc对volatile变量的处理很难预测。什么是适当的方式来做到这一点?
不知道这是多么可行:编译成汇编器,没有优化,你想要的代码,然后用'asm {}'块代替C代码并编译整个程序。 – pmg 2011-03-16 22:42:01
Ulrich Drepper的“每个程序员应该知道的内存”(http://www.akkadia.org/drepper/cpumemory.pdf)包含一些缓存属性的基准。 – ninjalj 2011-03-16 23:47:42
舌头:确保循环计算一个开放的数学问题的解决方案,以便编译器无法优化它:http://blog.regehr.org/archives/140 – 2011-03-17 00:05:28