我正在编写一个程序来计算我的CPU用来做一个" FLops"的持续时间。为此我写了下面的代码
before = clock();
y= 4.8;
x= 2.3;
z= 0;
for (i = 0; i < MAX; ++i){
z=x*y+z;
}
printf("%1.20f\n", ( (clock()-before )/CLOCKS_PER_SEC )/MAX);
我正在重复相同操作的问题。编译器是否优化了这种&#34; Thing&#34;?如果是这样,我必须做些什么来获得正确的结果?
我没有使用&#34; rand&#34;功能,所以它不会影响我的结果。
答案 0 :(得分:1)
这有一个循环携带的依赖,并没有足够的东西可以并行执行,所以如果有任何东西都可以执行,那么你不会测量FLOP,你可能会测量它的延迟浮点加法。循环携带的依赖链序列化所有这些添加。该链条中有一些副链,其中有多个副链,但它们并不依赖于任何东西,所以只有它们的吞吐量很重要。但是,吞吐量将比任何合理处理器上的添加延迟更好。
要实际测量FLOP,没有单一的配方。最佳条件很大程度上取决于微体系结构。你需要的独立依赖链的数量,最佳的add / mul比率,你是否应该使用FMA,这一切都取决于。通常你必须做一些比你写的更复杂的事情,如果你开始使用高级语言,你必须以某种方式欺骗它实际做任何事情。
有关灵感,请参阅how do I achieve the theoretical maximum of 4 FLOPs per cycle?
答案 1 :(得分:0)
即使您没有进行编译器优化(已经很好地列出了可能性),您的变量和结果将在第一次循环迭代之后在缓存中,然后在您的轨道上以比您更快的速度和性能如果程序必须为每次迭代获取新值,那就是。
因此,如果你想为这个程序的单次迭代计算单个翻牌的时间,你实际上必须为每次迭代提供新的输入。真的考虑使用rand(),只使用已知值srand(1)
左右的种子。
您的计算也应该不同; flops是你的程序在你的情况下执行的计算次数2 * n(其中n = MAX)。计算触发器使用的每次翻牌分隔时间的数量。