假设我们有以下代码:
int i,j;
for(i=0; i<20; i++)
A[i] = A[i] + B[i];
for(j=0; j<8; j++){
C[j] = C[j] + D[j];
E[j] = E[j] + C[j];
}
现在让我们假设我们有14相同的 CPUS 可以用来帮助我们并行计算最终结果。
14执行上述代码时,使用所有 cpu 可以获得的最大速度是多少?假设每个操作(加法)都需要1单位时间。
正如我所看到的,加速通常Ts/Tp是Ts使用1cpuTp所花费的时间,而使用所有可用 cpu 所花费的时间。
在我的示例中,我们将不得不花费时间单位来使用cpu20 + 8*2 = 36执行代码。1
然后使用14cpus,我们可以使用1时间单位来找到 的第一个14值A。然后使用6cpus 我们可以使用另一个1时间单位来6查找A.
在找到 的剩余值时,A我们将使用其他8cpu 来查找 的8值C并E通过花费2时间单位。
所以总的来说,我们会花费1 + (1 || 2) = 1 + 2 = 3时间单位,这意味着speedup36/3 = 12
这个对吗?我们能否以更好的方式使用 cpu 来实现更好的加速?此外,是否有可能以某种方式使用阿姆达尔定律更快地找到结果?阿姆达尔定律说,如果x是总代码中不能并行运行的部分,那么最大加速就是1/(x + (1 - x)/p)使用p的 CPU 数量,所以在我的情况下,这个数字将等于14.
但是我不确定我们如何找到可以并行运行的代码部分。如果我决定解决以下等式:

然后x = 1/78。但是,如何x仅通过查看代码来找到它?如果我决定更一般地看待我的问题,则需要20时间单位的第一个循环可以并行运行。但是在第二个循环中,循环内的操作不能并行运行,所以在16时间单位之外,只能8并行运行。
所以可以并行运行的总时间是28。所以x = 8/36。
因此,我们从 Amdahl 定律得到以下结果(来自 wolframalpha):

但我发现12按照上面解释的逻辑可以加快速度。我究竟做错了什么?
先感谢您