SIMD-BT 模型下的并行求点在多边形中

来源:互联网 发布:sql注入防护 编辑:程序博客网 时间:2024/05/16 11:59

在树连接的SIMD机器上并行化上述算法:
        假定Q有n条边,系统中有n个处理器p1,…,pn排成二叉树,编号从根开始自上而下,自左向右逐级向下推进。每一个处理器存储Q的一条边(由两个端点的笛卡尔坐标表示),点p的坐标为(xp,yp)。
        一开始根读进点p坐标,然后传播给其他处理器,当pj接收到p的坐标,它确定:p为端点的射线是否和Q的边ej相交;若相交则pj产生‘1’输出,否则输出‘0’。将各处理器之输出相加,其和若为奇数,则p位于Q中,否则p在Q外
       算法执行时,假定处理器pj已保存了边ej,算法结束时p1产生‘1’(p在Q中)或者‘0’(p不在Q中)的回答 

       输入:pj存有ej之坐标(j=1,…,n);点p(xp,yp)
       输出:p1回答‘1’或者‘0’
Procedure POINT IN POLYGON(x,y,answer)
Begin
1, 1.1    p1 reads (xp,yp)
    1.2    if  Lp intersects e1  then  s1 = 1
                 else   s1 = 0
                 end if
    1.3    p1 sends (xp,yp,s1) to p2 and (xp,yp,0) to p3

2,for i = log(n+1)-2 down to 1 do
       for j = 2 log(n+1)-1-i to 2 log(n+1)-i -1 pardo
          2.1 pj receives (xp,yp,s) from its parent
          2.2 if Lp intersects ej then sj = 1
                else  sj = 0
                end if
          2.3 pj sends (xp,yp,sj+s) to p2j and(xp,yp,0) to p2j+1
        end for
    end for

3,for j = 2 log(n+1)-1 to 2 log(n+1)-1 pardo
      3.1 pj receives (xp,yp,s) from its parent
      3.2 if Lp intersects ej  then aj = s + 1
            else  aj = s
            end if
   end for
4,for i = 1 to log(n+1)-1 do
      for j = 2 log(n+1)-i-1 to 2 log(n+1)-i -1 pardo
             aj = a2j + a2j+1
      end for
   end for
5,if a1 is odd then answer = 1 else answer = 0 end
end
算法分析和讨论:
算法第1—3步自上而下执行相交测试;算法第4—5步自下而上计算射线p的交点数。直线段相交的测试需常数步操作。如树有n个处理器,则1-3步和4-5步均需要O(log n)时间,所以算法t(n) = O(log n),而p(n) = n ,所以c(n) = O(n logn),显然不是最佳的。但是:

1,如果有好几个p点要同时判断是否在Q中,则上述算法      可以流水线方式执行,而流水线周期为常数
2,可以把上诉算法修改为最优的,基本思想就是使用n/logn 个处理器,每一个处理器存储Q的logn条边。这样就需要O(log(n/logn))的时间将p传播给所有的处理器,每一个处理器对它所存储的logn条边进行相交测试,并将射线p之交点数目相交,需要O(logn)时间。计算射线p的总的交点数目需要O(log(n/logn))时间,所以总的运行时间为O(logn).c(n) = n/logn *logn = n 为最优的,但是此时流水线的周期已经不是常数了。

此时的伪代码跟前面的有点区别,就是他得到p坐标后马上传给子节点,再进行本身logn条边的判断。
3,没考虑点p在画射线时出现的几种特殊情况

考虑的话,我觉得也只需要添加少许变量,来表明一下交点的状态即可,即说明交点和另一个顶点在射线的那一侧。

刚看些并行方面的算法,还没有去实现过,目前还处于理论上的,希望下学期可以去实现一下,嘿嘿!