并行与分布式计算导论 练习题指导(一)

第一题 CC操作的伪代码

回顾MPI的通信机制,写出如下Collective Communications操作的伪代码:

  • One-to-all Broadcast
  • All-to-all Reduction
  • Scatter

思路

  1. 选定通讯框架
  2. 考虑广播和规约的实现
    • 对于已经有对偶实现的部分(如已知one-to-all broadcast 求 one-to-all reduction),大体上只需将顺序倒置(将原本的循环迭代顺序改为倒序,如0至100改为100至0;将收发的顺序做调整),然后该框架下的最简单实例上人脑验证一遍即可
    • 对于没有对偶实现的部分,只需找到最简单的方法实现要求的内容即可(例如对于一个ring求all-to-all broadcast,我就执行p次one-to-all broadcast完事)

参考答案

下面全部以超立方体为例,超立方体结构实现上述三个通讯相对难一些,我觉得借鉴一下下面的框架,回过头去写个环形结构(Ring)的伪码应该是非常容易的

One-to-all Broadcast

需要注意的有三点
其一,超立方体的通信仅发生在二进制标号相差1位的进程之间(如11000与11010);
其二,在一个处理器向外发送信息之前,他必须先接收到信息(信息源除外);
其三,如果要进行高效的实现,就必须保证不会有重复的发送(也就是说,每一个处理器其信息来源是唯一的),在这个前提下,为了避免死锁,一个处理器A在发送消息时也只能发给将A作为唯一信息来源的处理器(否则A将持续请求send,在一些通讯协议下将构成死锁)

下面给出基于Hypercube的one-to-all broadcast

void One_to_all_Broadcast(
    int d,//超立方体维数
    int myId,//当前处理器标号
    int sourceId,//信息源标号
    MessaageType& message//消息
)
{
    int virtualId=myId ^ sourceID;//获得当前处理器相对于信息源的标号
    int mask=power(2,d)-1;//mask是一个二进制位全部为1的变量,用来控制发送权限
   	for(int i=d-1;i>=0;i--)//
    {
        int temp=1<<i;
        mask=mask^temp//mask的第i位将被设为0
        if(virtualId&mask==0)//判断收发权限,记该条件第一次成立时i=s
    	{
        	if(virtualID&temp==0)//一个进程只能向s及其低位不同于自己的进程发送消息
            {
                int virtualDes=virtualID^temp;//计算第i位不同于自己位置
                int des=virtualDes^source;//将相对位置转化为绝对位置
                send(message,Des);//向该位置发送消息
            }
            else//一个进程只能从第s位不同于自己的进程获得消息
            {
                int virtualSource=virtualID^temp;//计算第i位不同于自己位置
                int Sour=virtualSource^source;//将相对位置转化为绝对位置
                receive(message,Sour);//从该位置接收消息
            }
        }
    }
}

All-to-all Reduction

基于Hypercube的all-to-all reduction(以sum运算为例)

All-to-all的运算是相对简单的,因为所有处理器都将和所有处理器进行交互。
然而还是需要注意,交互的顺序是有讲究的。对于d维超立方体来说,最优的ata将在d步时完成reduction或broadcast。具体的思路大体就是使得在每一步中,选定一个平行棱等价类,并使得这个平行棱组中每一条棱的两端彼此交换信息。
听起来比较抽象,我举个例子:对于一个三维超立方体来说,以其某个顶点为原点,以该顶点出发的三条棱为xyz轴。第一步,选定所有平行于x轴的棱,所有被选定的棱的两端的处理器通过棱进行信息传递;第二步,对y轴的平行棱进行上述操作;第三步,对z轴的平行棱进行上述操作。

void All_to_all_reduction(
	int d,//超立方体维数
    int myId,//当前处理器标号
    int myMessage,
    int receiveMessage,
    int result
)
{
    result=myMessage;
    for(int i=d-1;i>=0;i--)
    {
        int partner=myID^(1<<i);
        send(myMessage,partner);
        receive(reciveMessage,partner);
        result+=reciveMessage;
    }
}
Scatter

基于Hypercube的Scatter

在原有的one-to-all broadcast的基础上,增加了从message中截取所需消息,保存,并将其从message中移除的部分(懒省事XD)

void Scatter(
    int d,//超立方体维数
    int myId,//当前处理器标号
    int sourceId,//信息源标号
    MessaageType& message//接收到的消息
)
{
    MessageType result;
    if(myId=sourceId)getAndDeleta(myId,message);//信息源截取自己的部分,将剩余部分广博出去
    int virtualId=myId ^ sourceID;//获得当前处理器相对于信息源的标号
    int mask=power(2,d)-1;//mask是一个二进制位全部为1的变量,用来控制发送权限
   	for(int i=d-1;i>=0;i--)//
    {
        int temp=1<<i;
        mask=mask^temp//mask的第i位将被设为0
        if(virtualId&mask==0)//判断收发权限,记该条件第一次成立时i=s
    	{
        	if(virtualID&temp==0)//一个进程只能向s及其低位不同于自己的进程发送消息
            {
                int virtualDes=virtualID^temp;//计算第i位不同于自己位置
                int des=virtualDes^source;//将相对位置转化为绝对位置
                send(message,Des);//向该位置发送消息
            }
            else//一个进程只能从第s位不同于自己的进程获得消息
            {
                int virtualSource=virtualID^temp;//计算第i位不同于自己位置
                int Sour=virtualSource^source;//将相对位置转化为绝对位置
               	receive(message,Sour);//从该位置接收消息
                result=getAndDeleta(myId,message)//截取本进程对应消息
            }
        }
    }
	message=result;//将手中的消息转化为自己所需要收到的消息
}

第二题 Floyd算法的等效关系与可扩展性函数

对于Floyd算法,存在一种MPI的实现使得每个处理器需要花费 Θ ( n 2 l o g p ) Θ(n2logp) Θ(n2logp)进行通信,且问题规模n时所需的内存容量为 n 2 n^2 n2,也即 M ( n ) = n 2 M(n) =n^2 M(n)=n2。求该系统的等效率关系与可扩展性函数。

思路

这种题的解法非常简单,大题分为三步

  1. 确定串行时间复杂度 T ( n , 1 ) T(n,1) T(n,1),确定所有进程花费在原串行时间以外的所有额外时间 T 0 ( n , p ) T_0(n,p) T0(n,p),确定问题规模与内存容量的相关关系M(n)
  2. 计算等效关系 T ( n , 1 ) ≥ C T 0 ( n , p ) ⟹ n ≥ f ( p ) T(n,1)\ge CT_0(n,p) \Longrightarrow n\ge f(p) T(n,1)CT0(n,p)nf(p)
  3. 计算可扩展性函数 M ( f ( p ) ) / p M(f(p))/p M(f(p))/p的复杂度级别

注意,根据 T 0 ( n , p ) T_0(n,p) T0(n,p)的定义,其应该包含通信时间+串行时间(因为串行部分被额外执行了p-1次),然而在等效关系中,额外时间被视为p的函数(因为我们把p视为变量,并讨论在p变化时不等式的成立情况,n在每一次分析中均为常量),故而实际上,在等效关系的计算中 T 0 ( n , p ) = Θ ( p κ ( n , p ) ) T_0(n,p)=\Theta( p\kappa(n,p)) T0(n,p)=Θ(pκ(n,p)),即其仅考虑p个处理器的通讯耗时

参考答案

由题目可知
T ( n , 1 ) = Θ ( n 3 ) T 0 ( n , p ) = Θ ( n 2 p l o g p ) M ( n ) = n 2 T(n,1)=\Theta(n^3)\\T_0(n,p)=\Theta(n^2 plogp)\\M(n)=n^2 T(n,1)=Θ(n3)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值