colterm[i]=0.0;
#pragmaompparallelforreduce(+:
colterm[i])
for(j=0;j
colterm[i]+=b[2*j][i]*b[2*j+1][i];
#pragmaompparallelfor
for(j=0;j
b[2*j][i]/=colterm[i];
b[2*j+1][i]/=colterm[i];
}
}
}
}
8.(12分)查阅文献并结合自己的体会,列举1-2个你的研究领域里存在的典型并行计算应用,讨论一下它们适合的并行计算模式(不少于500字)。
答案
1.证明:
(1)由超立方体的性质知:
一个d维的超立方体的每个节点都可由d位二进制来表示,则与某个节点的距离为i的节点必定在这d位二进制中有i位与之不同,那么随机从d位中选择i位就有
种选择方式,即与s的距离为i得节点就有
个。
(2)由
(1)所述可知:
节点u与节点v的距离为i则分别表示u、v节点的二进制位数中有i位是不同的。
设节点u表示为:
,节点v表示为:
,则现在就是要求得从
变换到
的途径有多少种。
那么利用组合理论知识可知共有
即
中途径。
所以存在i!
条从u到v的长度为i的路径。
2.解:
由题可知计算规模是固定的,所以在并行环境下,根据Amdahl定律可知:
加速比S=1/(1/p+f(1-1/p)),其中p为处理器数,f为串行分量的比例,则,f=(p/s-1)/(p-1),同时对于固定规模的问题,并行系统所能达到的加速上限为1/f,即受到串行分量的比例的限制。
在2个处理器的环境下,根据上图数据计算各并行程序的串行分量的比:
并行程序I:
f1=0.20;
并行程序II:
f2=0.06;
并行程序III:
f3=0.06;
并行程序IV:
f4=0.02;
并行程序V:
f5=0.15;
并行程序VI:
f6=0.03;
在16个处理器的环境下,根据上图数据计算各并行程序的加速比如下:
并行程序I:
S1=4.00
并行程序II:
S2=5.72;
并行程序III:
S3=8.41;
并行程序IV:
S4=10.00;
并行程序V:
S5=4.77;
并行程序VI:
S6=10.67;
则个并行程序在16个处理器的环境下与8个处理器的环境下的加速比提高了:
并行程序I:
d1=20%;
并行程序II:
d2=31%;
并行程序III:
d3=49%;
并行程序IV:
d4=60%;
并行程序V:
d5=25%;
并行程序VI:
d6=64%;
根据并行程序I、V的串行分量的比和16个处理器的环境下的加速比可知,对并行程序I、V在16个处理器上性能的陈述都选(b);
根据并行程序II和III的串行分量的比和16个处理器的环境下的加速比可知,对并行程序II在16个处理器上性能的陈述选(c);
根据并行程序III、IV、VI在16个处理器的环境下的加速比可知,对并行程序III、IV、VI在16个处理器上性能的陈述都选(a);
3.1)由Amdahl定律知:
加速比
依题意知:
代入计算得:
最大加速比为:
2)由题意知:
此时的串行时间比例为
则:
由式子
得:
故至少需要24台处理机。
4.(12分)将一个由256个节点组成的环以dilation-1的方式嵌入到一个8维超立方体里,环中的节点编号为0~255,
1)问环节点31,127,255分别映射到超立方体的哪个节点上?
31:
00010000;127:
01000000;255:
10000000
若超立方体中的结点10110011和01011001进行通讯,如果按照环网拓扑结构,从10110011出发,在超立方体中依次经过哪些节点才能把一条消息传递到01011001?
如果按照超立方体拓扑结构,又是如何实现从10110011传递一条消息到01011001的?
10110011:
221
01011001:
110
10110011(221)->10110001(222)->10110000(223)->10010000(224)->10010001->……->
10000000(255)->00000000(0)->00000001->…..->01011100(104)->01011101(105)->
01011111(106)->01011110(107)->01011010(108)->01011011(109)->01011001(110)
10110011->10110001->10111001->10011001->11011001->01011001(第一种方法)
10110011->00110011->01110011->01010011->01011011->01011001(第二种方法)
11010011->10010011->11010011->01010011->01010001->01011001(第三种方法)
5.Step1:
R={T11,T12}是无直接后继的任务,任取,选T12,有a(T12)<-1;
Step2:
i从2到12循环,完成对a(Tj)(j=1,2…12)赋值
i=2;R={T11,T10},N(T10)={1},N(T10)={0},选T11,则a(T11)<-2;
i=3;R={T9,T6,T10},N(T9)=2,N(T6)={2,1},N(T10)=1,选T10则a(T10)<-3;
i=4;R={T9,T6,T7,T8},N(T9)=2,N(T6)={2,1},N(T7)=3,N(T8)=3,T9,T6任选,选T6,a(T6)<-4;
i=5;R={T9,T7,T8},N(T9)=2,N(T7)=3,N(T8)=3,选T9,则a(T9)<-5;
i=6;R={T4,T5,T7,T8},N(T4)=5,N(T5)=5,N(T7)=3,N(T8)=3,任选T7,T8,选T7,则a(T7)<-6;
i=7;R={T4,T5,T8},N(T4)=5,N(T5)=5,N(T8)=3,选T8,则a(T8)<-7;
i=8;R={T4,T5,T3},N(T4)=5,N(T5)=5,N(T3)={7,6},T4,T5任选,选T4,则a(T4)<-8
i=9,R={T5,T3},N(T5)=5,N(T3)={7,6},选T5,则a(T5)<-9;
i=10,R={T2,T3},N(T2)={9,8,4},N{T3}={7,6},选T3,a(T3)<-10;
i=11,R={T2},N(T2)={9,8,4},选T2,a(T2)<-11;
i=12,a(T1)<-12;
Step3:
构造L表:
L={T1,T2,T3,T5,T4,T8,T7,T9,T6,T10,T11,T12};
Step4:
依据任务图和表L,应用Graham表调度算法,调度结果如Gantt图所示。
T8
T6
T3
T4
T9
T11
T1
T2
T5
T7
T10
T12
6.策略如下:
在执行后序遍历时,我们系统地访问树中所有的边,而且每条边要通过两次:
一次从父节点到子节点,而另一次从子节点到父节点。
现将每条边“分成”两条,一条用于从上往下的遍历(向下边),而另一条用于从下往上的回溯(向上边)。
这样,后序遍历树问题就可转换为单链表问题。
基于这种面向边的树遍历观点可以设计出一个快速的并行算法求结点编号。
该算法由四步完成。
具体如下:
Step1.构造一个单链表(singly-linkedList),单链表的每个顶点对应于遍历树时向下边或向上边。
Step2.给新创建的单链表中的每个结点赋权值。
与向下边相应的顶点赋予权值0,表示当这个边被遍历时,该结点不被计数;
与向上边相应的顶点赋予权值1,表示该结点要被计数。
如图3.3所示。
图3.3树的后序遍历。
说明:
(a)树
(b)增加向上边(虚线边)
(c)对树的边建立联结表,向下边赋权值0,向上边赋权值1
(d)计算各结点到表尾的位置序号(权值的后缀和)。
(e)后序遍历的结点编号
结点的后序遍历数=n-结点的位置序数
Step3计算节点的位置序号(rank)。
使用与“求单链表中元素位置序号”类似的方法求
singly-LinkedList表中每一元素的位置序号。
Step4与向上边相关联的处理机使用计算出的位置序号计算
结点的后序遍历数并赋给与之相联的树的结点
——该结点是向上边起始点所对应的结点。
7.floatrowterm[m];
floatcolterm[q];
inti,j;
#pragmaompparallelforprivate(i)if(j>5000)
for(j=0;j
{
for(i=0;i{
rowterm[i]=0.0;
rowterm[i]+=a[i][2*j]*a[i][2*j+1];
}
for(i=0;i{
a[i][2*j]/=rowterm[i];
a[i][2*j+1]/=rowterm[i];
}
}
#pragmaompparallelforprivate(i)if(j>5000)
for(j=0;j
{
for(i=0;i{
rowterm[i]=0.0;
colterm[i]+=b[2*j][i]*b[2*j+1][i];
}
for(i=0;i{
b[2*j][i]/=colterm[i];
b[2*j+1][i]/=colterm[i];
}
}
8.
我研究生阶段的主要研究方向就是做信息检索。
随着计算机的普及和网络的日益发展,数字化信息爆炸式增长。
这些海量信息包含了大量宝贵的资源,虽然单台计算机的处理能力不断提高,但是在如此大规模的条件下,要对这样海量的信息进行检索,单台计算机的处理能力毕竟有限,需要多台计算机进行“团队作战”。
而并行计算能够利用多台计算机或者多个处理器的计算或存储资源来解决大规模问题。
因此,很自然地会想到将并行处理技术引入到信息检索当中,产生了相应的并行信息检索。
要实现并行检索,首先让我们考察信息检索的一般过程:
图1一般信息检索的过程
如图1所示,用户提交一条查询,代理程序(broker)对原始查询进行处理(如查询的分析转换或格式化处理等等),然后将处理后的查询发给搜索程序,搜索程序找到结果并进行处理(如排序)后返回给代理,代理经过必要的处理(如结果的归整、合并等)将结果返回给用户。
从以上可以看出,信息检索有并行处理的潜力可以充分挖掘。
根据对象的不同,并行检索总体上可通过以下两种方式实现并行:
1.多条查询之间的并行处理
一个最自然的想法就是利用MIMD结构对多条查询的处理并行化,即每个处理器处理不同的查询,每个查询的处理之间相互独立,最多只对共享内存内的部分代码或者公有数据实行共享。
这种方法也称为任务级的并行检索。
它可以同时处理多个查询请求,从而提高检索的吞吐量。
图2显示了3条不同查询在3个处理器上的并行处理过程。
每条查询通过代理(也可同时运行多个代理程序,每个代理分别处理一条查询)发送到不同搜索程序(每个处理器上运行一个搜索程序)上去执行,每个搜索程序的结果通过代理返回到不同查询的发起者。
图2查询间的并行处理过程
如果MIMD由多台具有自身处理器和磁盘的计算机组成,每台机器执行自己的搜索程序,并且只访问本地的磁盘,则没有硬件资源访问冲突问题。
但如果多个搜索程序访问的是相同的磁盘资源,则可能存在磁盘存取冲突问题。
这时可以通过增加磁盘或采用类似Raid磁盘阵列的方法来减少冲突,但同时不免加大硬件设备的开销。
另外一些可能的方法包括复制访问频繁的数据到不同磁盘以降低访问冲突、将数据分割到多个磁盘等等。
查询间并行化策略是从一般检索升级到并行检索的最简单方法。
简单地说,就是将检索系统复制多份(数据可以复制也可以不复制),每份分别处理不同的查询请求。
当然,这种升级硬件资源消耗比较高。
而且,简单地堆积硬件资源并不一定就可以提高信息检索的效率,必须考虑硬件资源的访问冲突,设计合理的软件结构和访问策略,才能提高信息检索的总体性能。
2.单条查询内部的并行处理
即对单条查询的计算量进行分割,分成多个子任务,并分配到多个处理器上的搜索进程上去执行。
这种检索也称为进程级并行检索。
将单条查询分成多个子任务的方法通常有两种:
一种称为数据集分割,它是事先将数据集分割成多个子集合,对同一条查询分别查询多个子集合数据,然后将每个子集合上的结果合并成最终结果;另一种称为查询项分割,它是将查询分解成多个子查询(如将一个多关键词查询分成多个单关键词查询),对每个子查询分别查询数据集,得到部分结果,并将部分结果合并成最终结果。
图3给出了一个单条查询内部并行处理的示意图:
查询发送给代理程序,代理程序将一条查询划分成多条子查询,每条子查询分别发送给一个搜索进程进行处理,各进程返回的子结果在代理上进行综合,得到最后的总结果返回给用户。
图3查询内部的并行处理过程