我想介绍一系列的matrice操作,以了解他们将花多少时间。 (当我想起CPU可以愚蠢地通过指令咀嚼时,我更倾向于考虑优化),
for(int n = 0; n < times; ++n){
// scrambled to miss the cache on purpose
matrix[ rand()%matrixLen ] * matrix[ rand()%matrixLen ];
}
我的编译器不断优化此表达式。有没有办法让它实际执行此代码,同时仍然保留所有其他优化?
答案 0 :(得分:4)
最有可能的是,您需要使用#pragma。你如何做到完全取决于编译器(抱歉),但在这个过程中存在一定的共性:
// save your current options
#if SPEEDTEST
#pragma GCC push_options
#pragma GSS optimize("whatever the settings are")
#endif
// ... your code
// restore options
#if SPEEDTEST
#pragma GCC pop_options
#endif
或在你的情况下:
#if SPEEDTEST
#pragma optimize("", off)
#endif
// ... your code
#if SPEEDTEST
#pragma optimize("", on)
#endif
注意:you can't use some #pragma statements within a function
答案 1 :(得分:3)
您忽略计算结果,因此编译器可以将其删除。 只需存储结果:
<yourMatrixType> result = matrix[ rand()%matrixLen ];
for(int n = 0; n < times; ++n){
// scrambled to miss the cache on purpose
result *= matrix[ rand()%matrixLen ];
}
这应该会阻止编译器删除计算。
答案 2 :(得分:1)
生成一个便宜的结果,但在技术上依赖于所有结果。
例如,将它们全部添加并提取结果值。
然后,阻止优化返回值(创建动态库或其他),或输出分析代码的值。
这仍然需要重新排序代码元素,但它主要阻止表达式消除。 (小心结果很难在没有实际操作的情况下生成 - 添加比乘法更好,例如,一旦它到达0
它就可以提前退出“假设”规则)