首页
学习
活动
专区
圈层
工具
发布

计算FLops
EN

Stack Overflow用户
提问于 2015-03-03 19:27:40
回答 2查看 2.2K关注 0票数 2

我正在编写一个程序来计算我的CPU执行一个"FLops“所需的持续时间。为此,我编写了下面的代码

代码语言:javascript
复制
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);

我在重复同样的操作的问题。编译器不是优化了这类“东西”吗?如果是这样的话,我要怎么做才能得到正确的结果?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-04 20:10:24

这有一个循环携带的依赖关系,并且没有足够的东西并行执行,所以如果任何事情都被执行,那么您所测量的就不会是失败,这样您可能会度量浮点加法的延迟。循环所携带的依赖链序列化所有这些添加。这个链有一些小的边链,里面有乘法,但是它们不依赖任何东西,所以只有它们的吞吐量才重要。但是,这种吞吐量将比在任何合理处理器上添加的延迟要好。

要真正衡量失败,没有单一的配方。优化条件与微观结构密切相关。您需要的独立依赖链的数量,最佳的添加/mul比,是否应该使用FMA,这都取决于。通常,你必须做一些比你写的更复杂的事情,如果你开始使用一种高水平的语言,你必须以某种方式欺骗它去做任何事情。

有关灵感,请参阅how do I achieve the theoretical maximum of 4 FLOPs per cycle?

票数 1
EN

Stack Overflow用户

发布于 2015-03-04 08:04:00

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

因此,如果您想要计算这个程序的一个迭代的单个失败的时间,那么您实际上必须为每个迭代提供新的输入。请认真考虑使用rand()并只使用一个已知值srand(1)左右的种子。

您的计算也应该是不同的;失败是您的程序在2*n (其中n=最大值)情况下这样做的计算次数。若要计算每次触发器的时间量,请将使用的时间除以触发器数量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28840271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档