我们都在学习并行编程或则分布式编程。
但并行编程或则分布式编程究竟是在解决什么问题呢??????
软件开发可以看作是有无数函数和数据结构组成的。
当软件运行时会产生各种的状态数据。哪么如果我们有多个计算机。
如何将这些软件平均分配到这些计算机上呢?
这就是并行编程或则分布式编程所要解决的问题。
所以有了阿姆达尔定律。
S=1/(1-a+a/n)
其中 a 表示了软件并行部分所占的比例。
n 就是计算机的个数。
S为并行软件的加速比。
这样,当1- a=0时,(即没有串行,只有并行)最大加速比S = n;当a = 0时(即只有串行,没有并行),最小加速比S = 1;当 n → ∞时,极限加速比 s→ 1/(1- a),这也就是加速比的上限。
也就是说我们的软件在运行时有一部分是并行。另一部分串行的。并行的部分可以放入任意计算机内。而串行的部分需要集中放在一台计算机。而对于编程来说,线程可以看作是一个虚拟的计算环境。
到这里并行问题就变成了,软件如何分配到线程的问题。而答案也非常的明显,找到软件并行的部分和串行的两部分。把串行的部分放入一个线程,并行的部分根据并行的数量放入线程。
首先写一个简单的程序计算1到10万运算操作然后将结果放入数组输出。
#include
在我的电脑上用了1.36秒。
将其改为多线程方式,数组的前5个与后5个分别计算。也就是这段软件被分为了两个并行的部分。
#include
计算共耗时0.695秒比单线程方式少了一半左右的时间。
由阿姆达尔定律可知道。
因为我们的程序是完全可以并行的两个部分,所以并行比例a为1。线程数n为2得到理论加速比为。
S = 1/(1-1+1/2) = 2
与我们的加速比试验结果1.36 / 0.695 = 1.95是相近的。
如果我们将数组0到5的部分进行两次计算。0到5的部分变为了两次执行的串行操作。
int
修改单线程执行部分的代码如下。
void
可以得到多线程的运算时间为1.37秒。
在单线程模式下运算时间为2秒。
由阿姆达尔定律可以得到试验条件的加速比为。
2.0 / 1.37 = 1.45
将1.45代入到阿姆达尔公式得到试验的并行比例。
1.45 = 1/(1-a+a/2)
a = 0.62
因为是两个并行操作,一个串行操作。
与我们理论的并行比例为 2/3=0.666 是接近一致的。
到这里我们知道了并行编程是依据并行比例拆分软件到不同的硬件上运行的方法。
并知道如何通过阿姆达尔定理计算出并行的加速比以及反向推算软件的并行比例的方法。