计算触发器
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);
重复相同操作的问题。编译器不会优化这种"Thing"吗?如果是这样,我需要做什么才能获得正确的结果?
我没有使用 "rand" 函数,所以它不会与我的结果冲突。
即使您没有进行编译器优化(可能性已经很好地列出),您的变量和结果将在第一次循环迭代后进入缓存,从那时起您将以更快的速度和更高的性能走上正轨如果程序必须为每次迭代获取新值,那么你会比你想象的要好。
所以如果你想计算这个程序的单次迭代的单次失败的时间,你实际上必须为每次迭代提供新的输入。真的考虑使用 rand() 并只使用已知值 srand(1)
左右的种子。
你的计算应该也不一样;触发器是您的程序在您的情况下执行的计算次数 2 * n(其中 n = MAX)。计算每次翻牌的时间除以翻牌次数所用的时间。
这有一个循环携带的依赖性,没有足够的东西可以并行执行,所以即使有任何东西被执行,它也不会是你正在测量的 FLOPs,你可能会测量延迟浮点加法。循环携带的依赖链序列化所有这些添加。该链有一些带有乘法的小侧链,但它们不依赖于任何东西,所以只有它们的吞吐量很重要。但该吞吐量将优于任何合理处理器上添加的延迟。
要实际测量 FLOP,没有单一的方法。最佳条件在很大程度上取决于微体系结构。你需要的独立依赖链的数量,最佳的add/mul比例,你是否应该使用FMA,这一切都取决于。通常你必须做一些比你写的更复杂的事情,如果你开始使用高级语言,你必须以某种方式欺骗它实际做任何事情。
有关灵感,请参阅 how do I achieve the theoretical maximum of 4 FLOPs per cycle?
我正在编写一个程序来计算我的 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);
重复相同操作的问题。编译器不会优化这种"Thing"吗?如果是这样,我需要做什么才能获得正确的结果?
我没有使用 "rand" 函数,所以它不会与我的结果冲突。
即使您没有进行编译器优化(可能性已经很好地列出),您的变量和结果将在第一次循环迭代后进入缓存,从那时起您将以更快的速度和更高的性能走上正轨如果程序必须为每次迭代获取新值,那么你会比你想象的要好。
所以如果你想计算这个程序的单次迭代的单次失败的时间,你实际上必须为每次迭代提供新的输入。真的考虑使用 rand() 并只使用已知值 srand(1)
左右的种子。
你的计算应该也不一样;触发器是您的程序在您的情况下执行的计算次数 2 * n(其中 n = MAX)。计算每次翻牌的时间除以翻牌次数所用的时间。
这有一个循环携带的依赖性,没有足够的东西可以并行执行,所以即使有任何东西被执行,它也不会是你正在测量的 FLOPs,你可能会测量延迟浮点加法。循环携带的依赖链序列化所有这些添加。该链有一些带有乘法的小侧链,但它们不依赖于任何东西,所以只有它们的吞吐量很重要。但该吞吐量将优于任何合理处理器上添加的延迟。
要实际测量 FLOP,没有单一的方法。最佳条件在很大程度上取决于微体系结构。你需要的独立依赖链的数量,最佳的add/mul比例,你是否应该使用FMA,这一切都取决于。通常你必须做一些比你写的更复杂的事情,如果你开始使用高级语言,你必须以某种方式欺骗它实际做任何事情。
有关灵感,请参阅 how do I achieve the theoretical maximum of 4 FLOPs per cycle?