0

假设我们有以下代码:

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/TpTs使用1cpuTp所花费的时间,而使用所有可用 cpu 所花费的时间。

在我的示例中,我们将不得不花费时间单位来使用cpu20 + 8*2 = 36执行代码。1

然后使用14cpus,我们可以使用1时间单位来找到 的第一个14A。然后使用6cpus 我们可以使用另一个1时间单位来6查找A.

在找到 的剩余值时,A我们将使用其他8cpu 来查找 的8CE通过花费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按照上面解释的逻辑可以加快速度。我究竟做错了什么?

先感谢您

4

2 回答 2

0

您关于使用 amdahl 定律在 regads 中并行化此代码的假设是不正确的,您的代码是顺序的,因为 amdahl 定律关心这部分的增强,因此当您计算第一个循环时,只有 20 个串行作业中的 14 个被并行化。然后您的线程到达第二个循环(除非您想将此代码重新组织为完整的并行版本)。对于第二个循环,代码的所有部分都可以并行化。现在您应该找到每个增强部分对串行部分的增强百分比,然后找到它的加速比。

于 2013-09-01T19:59:53.050 回答
0

根据以下站点 http://www.futurechips.org/thoughts-for-researchers/parallel-programming-gene-amdahl-said.html CPU的数量不应该限制在14个,你应该采取的大小您的向量为 n。我们使用 Amadahl 定律所做的是找出算法的可扩展性以及当 p 趋于无穷大时会达到这个极限。

于 2013-08-18T15:55:38.407 回答