我正在编写一个程序来计算我的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);我在重复同样的操作的问题。编译器不是优化了这类“东西”吗?如果是这样的话,我要怎么做才能得到正确的结果?
我没有使用“兰德”函数,所以它不会与我的结果冲突。
发布于 2015-03-04 20:10:24
这有一个循环携带的依赖关系,并且没有足够的东西并行执行,所以如果任何事情都被执行,那么您所测量的就不会是失败,这样您可能会度量浮点加法的延迟。循环所携带的依赖链序列化所有这些添加。这个链有一些小的边链,里面有乘法,但是它们不依赖任何东西,所以只有它们的吞吐量才重要。但是,这种吞吐量将比在任何合理处理器上添加的延迟要好。
要真正衡量失败,没有单一的配方。优化条件与微观结构密切相关。您需要的独立依赖链的数量,最佳的添加/mul比,是否应该使用FMA,这都取决于。通常,你必须做一些比你写的更复杂的事情,如果你开始使用一种高水平的语言,你必须以某种方式欺骗它去做任何事情。
有关灵感,请参阅how do I achieve the theoretical maximum of 4 FLOPs per cycle?
发布于 2015-03-04 08:04:00
即使您没有编译器优化(可能性已经很好地列出),您的变量和结果将在第一次循环迭代之后进入缓存,从那时起,您将以比您更快的速度和性能在轨道上运行,如果程序必须为每次迭代获取新的值。
因此,如果您想要计算这个程序的一个迭代的单个失败的时间,那么您实际上必须为每个迭代提供新的输入。请认真考虑使用rand()并只使用一个已知值srand(1)左右的种子。
您的计算也应该是不同的;失败是您的程序在2*n (其中n=最大值)情况下这样做的计算次数。若要计算每次触发器的时间量,请将使用的时间除以触发器数量。
https://stackoverflow.com/questions/28840271
复制相似问题