假设我们有以下代码:
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
使用1
cpuTp
所花费的时间,而使用所有可用 cpu 所花费的时间。
在我的示例中,我们将不得不花费时间单位来使用cpu20 + 8*2 = 36
执行代码。1
然后使用14
cpus,我们可以使用1
时间单位来找到 的第一个14
值A
。然后使用6
cpus 我们可以使用另一个1
时间单位来6
查找A
.
在找到 的剩余值时,A
我们将使用其他8
cpu 来查找 的8
值C
并E
通过花费2
时间单位。
所以总的来说,我们会花费1 + (1 || 2) = 1 + 2 = 3
时间单位,这意味着speedup
36/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
按照上面解释的逻辑可以加快速度。我究竟做错了什么?
先感谢您