【课后习题】

一、 问答题


1、在讨论PRAM-CRCW时,我们说CRCW是最强的PRAM模型,还给出了四种不同的CRCW模型:公共PRAM-CRCW,任意PRAM-CRCW,优先PRAM-CRCW,求和PRAM-CRCW。可以在其他的PRAM模型上对一个PRAM-CRCW模型进行仿真,假设t是优先PRAM-CRCW上一个算法的运行时间,请给出这个算法在下面的模型上的运行时间上限:
    (1) 公共PRAM-CRCW
    (2) 任意PRAM-CRCW
    (3) PRAM-CREW
    (4) PRAM-EREW




2、考虑如下的PRAM-EREW模型:p个处理器,m个存储器。我们可以在一个p个处理器,每个处理器有m/p个存储器的消息传递结构的并行计算机上模拟这个模型。如果一个算法在这种PRAM-EREW上的运行时间是t,请给出这个算法在下面的体系结构上的运行时间上限:
    (1) p处理器的环(ring)
    (2) p处理器的二维网格(mesh)
    (3) p处理器的超立方体(hypercube)




3、假定处理器Pi(1≤i≤n )开始时存有数据di,所谓的前序累加求和(Prefix-Sum)指用 来代替Pi中的原始数据di ,下面的算法给出了PRAM模型上的前序累加求和的算法:
前序累加求和算法
输入:Pi中保存有di ,1≤i≤n
输出:Pi中的内容为
Program Prefix_sum
Begin
    for j=0 to logn - 1 do
        for k = 2j + 1 to n par-do
              (i)   Pi = di - 2j
              (ii)  di = di + di - 2j
        endfor
    endfor
End.

其中,Par-do表示不同的循环变量对应的计算可以并行执行
    (1) 以n = 8为例,按照上面的算法逐步计算出累加和。
    (2) 分析算法时间复杂度。




4、试分析以下用BSPLib并行求4个整数1,2,3,4的前序累加和的过程(参见图)。



程序如下:

/*用BSPLib求前序累加和*/
#include "bsp.h"
int bsp_allsums ( int x ) {
    int j, left, right;

    bsp_push_reg(&right, sizeof(int));
    bsp_push_reg(&left, sizeof(int));

    right = x;
    for( j = 1 ; j < bsp_nprocs(); j * = 2) {
        if ( bsp_pid ( ) + j < bsp_nprocs ( ) )
            bsp_put ( bsp_pid( ) + j , &right, & left ,0 ,sizeof ( int ));
        bsp_sync( );
        if( bsp_pid ( ) > = j ) right + = left;
    }
    bsp_pop_reg( &right );
    bsp_pop_reg( &left );
    return right ;
}

void main ( ) {
    bsp_begin ( bsp_nprocs( ) );
        printf(" On %d sum is %d \n", bsp_pid( ), bsp_allsums (1 + bsp_pid ( ) ) );
    bsp_end ( ) ;
}