繁体   English   中英

计算 FLops

[英]Calculating FLops

我正在编写一个程序来计算我的 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);

我重复相同操作的问题。 编译器不会优化这种“东西”吗? 如果是这样,我必须做什么才能获得正确的结果?

我没有使用“rand”函数,所以它不会与我的结果冲突。

这具有循环携带的依赖性,并且没有足够的东西可以并行执行,因此如果根本执行任何操作,则不会是您正在测量的 FLOP,因此您可能会测量浮点加法的延迟。 循环携带的依赖链序列化了所有这些添加。 该链有一些带有乘法的小侧链,但它们不依赖任何东西,因此只有它们的吞吐量很重要。 但该吞吐量将比任何合理处理器上添加的延迟要好。

要实际测量 FLOP,没有单一的方法。 最佳条件在很大程度上取决于微体系结构。 你需要的独立依赖链的数量,最佳的加/乘比,你是否应该使用 FMA,这一切都取决于。 通常你必须做一些比你写的更复杂的事情,如果你准备使用高级语言,你必须以某种方式欺骗它实际做任何事情。

寻找灵感,看看我如何达到每个周期 4 FLOPs 的理论最大值?

即使您没有进行编译器优化(可能性已经很好地列出),您的变量和结果将在第一次循环迭代后缓存,从那时起,您将以比您更高的速度和性能进入赛道,如果程序必须为每次迭代获取新值。

因此,如果您想为该程序的单次迭代计算一次触发器的时间,您实际上必须为每次迭代提供新的输入。 真正考虑使用 rand() 并且只使用已知值srand(1)左右的种子。

你的计算也应该不同; flops 是您的程序在您的情况下进行的计算次数 2*n(其中 n = MAX)。 计算每个触发器的时间除以触发器的数量所用的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM