我对Amdahl定律感到困惑,以确定性能提升和串行应用程序部分,但未能弄清楚这一点。
已知如下:
S(N) = Speedup factor for (N) CPU's
N = Number of CPU's
f = The part of the program which is executed sequential
S(N) = N / ( 1 + f * ( N - 1 ) )
如果我有4个CPU且加速因子(性能增益)为3倍。 f 会是什么?
我的猜测:
S(N) = 3 (that's our performance gain using 4 CPU's)
N = 4
所以在公式中输入这些值:
3 = 4 / ( 1 + f * ( 4 - 1 ) )
当我说f = 0,11时,我是否正确?或者我需要将S(N)设置为1(除以3)?或者我做错了什么?
答案 0 :(得分:1)
我的同学给出了(到目前为止工作/正确)答案。
我做了以下课程: 消除了对抗混乱。
这应该解决它。
编辑:
好的,先前的答案是错误的,但我找到了解决方案。
你首先计算可以并行完成的部分(它在维基百科上,但我花了一些时间来理解),然后你计算了连续部分。
所以最后的课程变成了这个:
/**
* @param s - The maximum performance profit.
* @param n - The amount of processors that are usable..
* @return f - The sequential part of the program.
*/
public final double sequentialCalculation(final double s, final double n) {
double p = 0; //the part that can be executed in parallel
double f = 0;
if (s <= 0) {
throw new IllegalArgumentException("S > 0");
}
if (n <= 0) {
throw new IllegalArgumentException("N > 0");
}
p = ((1 / s) - 1) / ((1 / n) - 1);
f = 1 - p;
return f;
}
欢迎你。
答案 1 :(得分:0)
如果这是您应该使用的等式,我认为您认为这有点不对,所以让我试着解释一下。
f是您的程序在单核实现中未并行化的代码部分所花费的时间的百分比(也称为0 <= f <= 1)。例如,如果您有这样的程序:
// this takes 15 seconds
init();
for (int i = 0; i < 10; i++) {
// this takes 10 seconds, and will be split
// between threads when in parallel
calculate();
}
// this takes 5 seconds
finalize();
这将在15+(10 * 10)+ 5 = 120秒内(连续)运行。但是,如果并行实现,则有20秒的执行无法在多个核心之间拆分。这意味着即使平行件加速所以只需要10秒钟来执行所有10次迭代,整个程序仍然需要30秒。这有助于告诉我们 - 有多少问题可以从并行化中受益。在这个例子中,总共120个中的20秒必须连续完成,f = 20/120 = 1/6。
使用这个f的新值,你可以根据Amdahl获得加速。一个免责声明 - 这远非衡量加速的唯一方法,不同的方法各有利弊。