并行计算划分和分治策略.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
现。递归分治法能使各个子问题并行化执行,即各个
进程用来执行被分解的部分。
通常数据的划分也同时局部化。
划分策略 Partitioning Strategies
数据划分(data partitioning or domain
decomposition)
来自百度文库
----数据域并行(SIMD或SPMD)
数据划分是并行计算中的主要策略
分治法是将大问题递归地分解为容易处理的小问题, 并且保持解决小问题与解决大问题的方法是一致的。
P0
P0
P4
P0
P2
P4
P6
P0
P1
P2
P3
P4
P5
P6
P7
分治法的并行实现:SPMD并行算法
Divide_conquer(T, pro_id, &k) //假设有n=2k个处理器
{
if |T|>given_limit /* |T|表示任务T的规模 */ { divide(T, T1,T2); k--; 除pro_id进程,再激活一个编号为pro_id ^ 2k的进程; Divide_conquer(T1, pro_id, &k); // ^为异或操作 Divide_conquer(T2, pro_id ^ 2k, &k); 组合 T1 和 T2 的结果作为 T 的结果,返回; } else 处理T,并将T的结果返回;
第四章 划分和分治策略
划分(partitioning):将问题分为若干个独立的部分。
分治法(divide and conquer method):将一个大问 题逐步分割成若干个原问题的子问题,用简单且相同 的方法对这些子问题进行求解,然后将这些子问题的 解组合成原问题的解。
在分治法中分解问题和合并结果常使用递归技术来实
群体操作要 求参与操作 的所有进程 必须都执行 相同的例程
分治法
用数列求和来说明分治法的基本思想:
int add (int s[ ]) //顺序算法 { if (number(s)<=2) return (n1+n2); else { Divide(s, s1,s2); part_sum1= add (s1); part_sum2= add (s2); return (part_sum1+ part_sum2); } }
A0… An/p-1 An/p… A2n/p-1 A2n/p………… A(p-1)n/p… An-1
+
+
………
+
局部和
+
总和
序列求和方法
主从结构
点到点通信(send&recv) 广播通信(broadcast) 散射通信(scatter)
分治法
主从结构划分求和算法(send&recv)
master:
主从结构划分求和算法(broadcast)
master:
s = n / p;
slave:
bcast (numbers, s, Pmaster);
bcast (numbers, s, Pslave_group);
sum = 0; for (i=0; i<p; i++)
/* slave_number : 0..m-1 */
part_sum = 0; for (i=0; i<s; i++) part_sum += numbers[i]; send(&part_sum, Pmaster);
sum += part_sum;
}
利用send和recv例程进行通信的并行求和算法的执行 时间: 1.主进程将p段数据分别发送给各个从进程的时间: p * (tstart + (n/p) tdata) 2.各从进程计算自己拥有的n/p个数据局部和的时间: n/p – 1 3.主进程从p个从进程接收局部和的时间: p * (tstart + tdata) 4.主进程计算p个局部和的总和的时间: p 整个算法的执行时间为: 2 p tstart + (n+p) tdata + n/p – 1 + p = O(n+p)
/*每个处理器计算s个数之和*/
s = n / p; for (i =0,x=0; i<p; i++, x=x+s) send(&numbers[x], s, Pi); sum=0; for (i=0; i<p; i++) { recv(&part_sum, Pany);
slave:
recv(&numbers, s, Pmaster);
}
主从结构划分求和算法(scatter)
master:
s = n / p; root = Pmaster; scatter(numbers, &s, Pgroup, root ); reduce(&sum, &s, ADD, Pgroup, root);
slave:
scatter(numbers, &s, Pgroup, root); part_sum = 0; for (i=0; i<s; i++) part_sum += numbers[i]; reduce(&part_sum, &s, ADD, Pgroup, root);
start = slave_number * s; end = start + s;
{
recv(&part_sum, Pany); sum += part_sum;
part_sum = 0;
for (i=start; i<end; i++) part_sum += numbers[i]; send(&part_sum, Pmaster);
功能划分(functional decomposition)
----控制并行(MIMD或MPMD) 正如前面给出的一些例子的并行处理方法所示,我 们总是将问题要处理的数据集尽可能均匀地分配给 各个处理机(或进程),这是因为数据并行往往能 够带来更高的效率。
例:利用数据划分技术对数列求和。
假设有 p 个处理机,数列元素个数为 n。
}
算法的时间分析
假设有p = 2k个处理机,共计算N个数的和 计算时间:N/p+log p 通信时间: Tcomm1 = tstartup+N/2 tdata + tstartup+N/4 tdata +… + tstartup+N/p tdata = k tstartup+(N(p-1)/p) tdata = O(N) Tcomm2 = k(tstartup+tdata) = log p (tstartup+tdata)
进程用来执行被分解的部分。
通常数据的划分也同时局部化。
划分策略 Partitioning Strategies
数据划分(data partitioning or domain
decomposition)
来自百度文库
----数据域并行(SIMD或SPMD)
数据划分是并行计算中的主要策略
分治法是将大问题递归地分解为容易处理的小问题, 并且保持解决小问题与解决大问题的方法是一致的。
P0
P0
P4
P0
P2
P4
P6
P0
P1
P2
P3
P4
P5
P6
P7
分治法的并行实现:SPMD并行算法
Divide_conquer(T, pro_id, &k) //假设有n=2k个处理器
{
if |T|>given_limit /* |T|表示任务T的规模 */ { divide(T, T1,T2); k--; 除pro_id进程,再激活一个编号为pro_id ^ 2k的进程; Divide_conquer(T1, pro_id, &k); // ^为异或操作 Divide_conquer(T2, pro_id ^ 2k, &k); 组合 T1 和 T2 的结果作为 T 的结果,返回; } else 处理T,并将T的结果返回;
第四章 划分和分治策略
划分(partitioning):将问题分为若干个独立的部分。
分治法(divide and conquer method):将一个大问 题逐步分割成若干个原问题的子问题,用简单且相同 的方法对这些子问题进行求解,然后将这些子问题的 解组合成原问题的解。
在分治法中分解问题和合并结果常使用递归技术来实
群体操作要 求参与操作 的所有进程 必须都执行 相同的例程
分治法
用数列求和来说明分治法的基本思想:
int add (int s[ ]) //顺序算法 { if (number(s)<=2) return (n1+n2); else { Divide(s, s1,s2); part_sum1= add (s1); part_sum2= add (s2); return (part_sum1+ part_sum2); } }
A0… An/p-1 An/p… A2n/p-1 A2n/p………… A(p-1)n/p… An-1
+
+
………
+
局部和
+
总和
序列求和方法
主从结构
点到点通信(send&recv) 广播通信(broadcast) 散射通信(scatter)
分治法
主从结构划分求和算法(send&recv)
master:
主从结构划分求和算法(broadcast)
master:
s = n / p;
slave:
bcast (numbers, s, Pmaster);
bcast (numbers, s, Pslave_group);
sum = 0; for (i=0; i<p; i++)
/* slave_number : 0..m-1 */
part_sum = 0; for (i=0; i<s; i++) part_sum += numbers[i]; send(&part_sum, Pmaster);
sum += part_sum;
}
利用send和recv例程进行通信的并行求和算法的执行 时间: 1.主进程将p段数据分别发送给各个从进程的时间: p * (tstart + (n/p) tdata) 2.各从进程计算自己拥有的n/p个数据局部和的时间: n/p – 1 3.主进程从p个从进程接收局部和的时间: p * (tstart + tdata) 4.主进程计算p个局部和的总和的时间: p 整个算法的执行时间为: 2 p tstart + (n+p) tdata + n/p – 1 + p = O(n+p)
/*每个处理器计算s个数之和*/
s = n / p; for (i =0,x=0; i<p; i++, x=x+s) send(&numbers[x], s, Pi); sum=0; for (i=0; i<p; i++) { recv(&part_sum, Pany);
slave:
recv(&numbers, s, Pmaster);
}
主从结构划分求和算法(scatter)
master:
s = n / p; root = Pmaster; scatter(numbers, &s, Pgroup, root ); reduce(&sum, &s, ADD, Pgroup, root);
slave:
scatter(numbers, &s, Pgroup, root); part_sum = 0; for (i=0; i<s; i++) part_sum += numbers[i]; reduce(&part_sum, &s, ADD, Pgroup, root);
start = slave_number * s; end = start + s;
{
recv(&part_sum, Pany); sum += part_sum;
part_sum = 0;
for (i=start; i<end; i++) part_sum += numbers[i]; send(&part_sum, Pmaster);
功能划分(functional decomposition)
----控制并行(MIMD或MPMD) 正如前面给出的一些例子的并行处理方法所示,我 们总是将问题要处理的数据集尽可能均匀地分配给 各个处理机(或进程),这是因为数据并行往往能 够带来更高的效率。
例:利用数据划分技术对数列求和。
假设有 p 个处理机,数列元素个数为 n。
}
算法的时间分析
假设有p = 2k个处理机,共计算N个数的和 计算时间:N/p+log p 通信时间: Tcomm1 = tstartup+N/2 tdata + tstartup+N/4 tdata +… + tstartup+N/p tdata = k tstartup+(N(p-1)/p) tdata = O(N) Tcomm2 = k(tstartup+tdata) = log p (tstartup+tdata)