并行计算流水线计算

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对第一个进程来说,需要n个流水线周期得到全部的n个数; 随后的进程则需要 n-1个流水线周期来进行接收、比较和发 送操作。 所以整个算法的时间复杂性为:
n + n -1 = 2n –1个流水线周期 当然,我们还可以将排序后的数据传给主进程。离主 进程越近的从进程传送结果的通信时间越少,反之, 通信时间越多。
1 P0 P1 P2 P3 P4 2 1 3 2 1 1 4 3 2 2 1 1 5 4 3 3 2 2 1 流水线时间
5 4
5 4 3
5 4 3 2 1
5 4 3 2
5 4 3 2
1
1
显然这种排序算法属于流水线计算中的第二种类型, 即同样的数据被不同的进程多次操作。 算法 的执行时间分析: 如果有 n 个数要排序,同时有 n 个流水线进程,那么 该并行算法的实现需要:
P1
P2
P3
P4
P5
P6 m
P7
P8
P9
P9 P8 P7 P6 P5 P4 P3 d0 P2 d0 d1 P1 P0 d0 d1 d2
d0 d1 d2 d3
d0 d1 d2 d3 d4
d0 d1 d2 d3 d4 d5
d0 d1 d2 d3 d4 d5 d6
d0 d1 d2 d3 d4 d5 d6 d7
排序算法的执行过程
将要被排序的数列:5, 2, 1, 3, 4
5 P0 P1 P2 P3 P4 2 1 5 2 2 3 5 1 2 1 1 4 5 3 3 2 2 1 流水线时间
5
5 4
5 4 3
5 4 3 2 1
5 4 3 2
5 4 3 2
1
1
最坏情况下的排序算法的执行过程
将要被排序的数列:1, 2, 3, 4, 5
2、回代法求解上三角线性方程组
an-1,0 x0+an-1,1 x1+ an-1,2 x2+ …an-1,n-2 xn-2+ an-1,n-1 xn-1 = bn-1 an-2,0 x0+an-2,1 x1+ an-2,2 x2+ …an-2,n-2 xn-2 = bn-2
an-3,0 x0+an-3,1 x1+ an-3,2 x2+ …
d0 d1 d2 d3 d4 d5 d6 d7 d8
d0 d1 d2 d3 d4 d5 d6 d7 d8 d9
d1 d2 d3 d4 d5 d6 d7 d8 d9
d2 d3 d4 d5 d6 d7 d8 d9
d3 d4 d5 d6 d7 d8 d9
d4 d5 d6 d7 d8 d9
d5 d6 d7 d8 d9
利用回代法的流水线处理过程
小结
流水线计算是通过将任务按功能划分成若干个级或 子任务,每个级可以同时执行,且一级的输出是下 一级的输入。每个子任务由不同的处理部件执行。
常见的适合流水线技术的并行计算问题:
1. 2. 3.
如果对同一个问题有多个实例需要执行;
如果有一系列数据项要处理,而每个数据项需要多次操作; 如果进程在完成自己的全部操作之前能够提供下一个进程 启动所需的信息。
直到所有数据均被处理完。
流水线排序方法的机器结构:
主进程 从进程
未排序
的数列
P0
P1
Pp-1
可将结果返回给主进程的双向流水线机器结构:
主进程 未排序 已排序 从进程
的数列
P0
P1
Pp-1
算法:进程Pi的排序算法
right_procnum = n - i -1; //n为进程总数,共有 //n-i-1个数据需要Pi比较 recv (x, Pi-1); for (j = 0; j< right_procnum; j++) { recv (number, Pi-1); if (number > x) { send(x, Pi+1); x = number; } else send (number, Pi+1); }
P0
P1
P2
P3
P4
例1:将数组 a 的所有元素累加到sum中
顺序算法
for (i = 0; i < n; i++) sum = sum + a[i]
并行算法
a[0]
a
a[1]
a
a[2]
a
a[3]
a
sum
Sin
Sout
Sin
Sout
Sin
Sout
Sin
Sout
每个处理机(流水线中的中间级)需要执行相同的操作:
x1 = (b1 - a1,0 x0) / a1,1 随后,将x0和x1的值代入倒数第三个方程,求出x2: x2 = (b2 - a2,0 x0 - a2,1 x1) / a2,2 …… 直到求出所有的xi (0 i n-1) ,即得到了方程组的 解。
流水线并行方式
流水线中第一个进程(流水线级)计算 x0,并将 x0传递给第二个进程;

Time
第3种情况:在进程执行结束之前传递信息给流水线中 的下一个进程,使其能够开始工作。 启动下一个进程必须的信息传输
当任务分解的级的数量比流水线中处理机的数
量多时,每个处理机就分到一组流水线级。
Processor 0
Processor 1
Processor 2
P0
P1
பைடு நூலகம்
P2
P3
P4
P5
P6
P7
第二个进程(流水线级)用x0计算出x1,然后将 x0和x1 发给第三个进程;
第 i 个进程从第 i-1个进程接收x0, x1,…, xi-1,并 计算xi ,并将x0, x1,…, xi 传递给下一个进程; ……
P0 计算x0
x0
P1 计算x1
x0 x1
P2 计算x2
x0 x1 x2
P3 计算x3
x0 x1 x2 x3
第五章 流 水 线 计 算 Pipelined Computations
5.1 流水线技术
流水线计算是通过将任务按功能划分成若干个级
(pipeline stage) 或子任务,每个级可以同时执行,
且一级的输出是下一级的输入。
流水线计算是串行程序设计的基础。
每个子任务由不同的处理部件执行。
…… a4 a3 a4 a4… a4 a3 a3… a2 a2 a1
recv (sum,Pi-1);
sum = sum + a; send (sum, Pi+1);
该过程的程序:
假设第 i 个处理机将数组的第 i 个元素存入局部 变量 number。
if (processnum > 0)
{
recv (sum, Pi-1); sum = sum + number;
} if (processnum < n -1) send (sum, Pi+1);

P0 实例1 实例2 实例3 实例4 实例5 实例6 实例7
执行时间
时间
假设每个流水线级均用一个流水线周期,对有 p 级流水线和 m 个问题 实例而言,算法的执行时间:
= m + p - 1 个流水线周期
第2种情况:每个数据项需要多次操作
输入序列
d9d8d7d6d5d4d3d2d1d
0
P0 p-1
第 i 个进程 (0 < i < n) 接收x0, x1,…, xi-1 ,并 且计算xi:
bi - ai,j xj
xi =
0 j i-1
ai, i
已知ai,j 和 bi 存放在数组 a[ ][ ] 和 b[ ]中,要求的解 向量在x[ ]中。
顺序算法如下: x[0] = b[0] / a[0][0]; /* computed separately */ for (i = 1; i < n; i++) { /* for remaining unknowns */ sum = 0; for (j = 0; j < i; j++) sum = sum + a[ i ][ j ] * x[ j ]; x[ i ] = (b[ i ] - sum) / a[ i ][ i ]; }
合适的平台。
流水线并行计算的应用实例
• • 数列排序 生成质数

回代法求解上三角线性方程组
1、数列排序
任务:将一个数列从大到小(或从小到大)排列。 排序方法:
流水线上的第一个进程每次接收一个准备排序数 列中的数;
如果刚刚接收的数比自己目前拥有的数大,则保 存新的数据,并将原有的较小的数据发送给下一 个进程;否则将刚刚接收(较小)的数据发送给 下一个进程。 随后的各个进程也同样从上一级接收新的数据, 保留其中较大的数据,同时发送较小的数据。
P8
流水线应用的计算平台
流水线操作的一个关键要求是流水线的相邻进程 之间要有发送消息的能力。这种操作方式决定了 它最适合于线性或者环形网络结构,即相邻的处 理机之间有直接通信链路。如下图例。
线性结构的 多处理机系统
主机
Processors
线性结构和环形结构可以完美地嵌入到网格和超 立方体结构之上。这就使得网格和超立方体成为
算法改进:进程Pi的排序算法(排序结果传给主进程)
right_procnum = n - i -1; recv (x, Pi-1); for (j = 0; j< right_procnum; j++) { recv (number, Pi-1); if (number > x) send(x, Pi+1); x = number; } else send (number, Pi+1); } send(x , Pi-1); for (j = 0; j< right_procnum; j++) { recv (number, Pi+1); send (number, Pi-1); }
…… a2,0 x0+a2,1 x1+ a2,2 x2 a1,0 x0+a1,1 x1
= bn-3
= b2 = b1
a0,0 x0
= b0
其中 ai,j 和 bi 已知,xi 是待求的未知数(0 i, j n-1)
实现回代法的顺序方法:
先从最后一个方程求出x0:
x0 = b0/a0,0
随后,将x0的值代入倒数第二个方程,求出x1:
并行算法(2)
进程Pi (0 < i < n)的伪码: sum = 0; for (j = 0; j < i; j++) { recv ( x[ j ], Pi-1 ); // 接收 1个值, send ( x[ j ], Pi+1 ); // 并向下传播 sum = sum + a[ i ][ j ] * x[ j ]; // 计算 } x[ i ] = (b[ i ] - sum) / a[ i ][ i ]; send (x[ i ], Pi+1 ); // 发送x[ i ]
流水线技术在以下三种计算中将会得到很好 的并行效益:
1. 2.
如果对同一个问题有多个实例需要执行; 如果有一系列数据项要处理,而每个数据项需 要多次操作;
3.
如果进程在完成自己的全部操作之前能够提供 下一个进程启动所需的信息。
第1种情况:同一个问题有多个实例需要执行
p-1 P5 P4 P3 P2 P1 m 实例1 实例2 实例3 实例4 实例1 实例2 实例3 实例4 实例5 实例1 实例2 实例3 实例4 实例5 实例6 实例1 实例2 实例3 实例4 实例5 实例6 实例7 实例1 实例2 实例3 实例4 实例5 实例6 实例7 … …
并行算法(1) 注:P0 进程只是计算 x0 和发送 x0
进程Pi (0 < i < n)的伪码: for (j = 0; j < i; j++) // 接收 i个值,并向下传播 { recv ( x[ j ], Pi-1 ); send ( x[ j ], Pi+1 ); } sum = 0; // 计算x[ i ] for (j = 0; j < i; j++) sum = sum + a[ i ][ j ] * x[ j ]; x[ i ] = (b[ i ] - sum) / a[ i ][ i ]; send (x[ i ], Pi+1 ); // 发送x[ i ]
相关文档
最新文档