在樹連線的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在畫射線時出現的幾種特殊情況
考慮的話,我覺得也只需要新增少許變數,來表明一下交點的狀態即可,即說明交點和另乙個頂點在射線的那一側。
剛看些並行方面的演算法,還沒有去實現過,目前還處於理論上的,希望下學期可以去實現一下,嘿嘿!
並行程式設計模型的研究
並行程式設計模型 是平行計算,尤其是並行軟體的基礎,也是並行硬體系統的導向,在面臨多核新挑戰的情況下,什麼樣的並行程式設計模型在未來能成為主流,還很難說。至少到目前,還處於百家爭鳴的時代,很多模型提出,很多在應用,下面我們簡單介紹一下當前的並行程式設計模型現狀。並行程式設計模型一直是平行計算研究領域...
平行計算的3中基本模型
pram parallel random access machine 模型是單指令流多資料流 simd 並行機中的一種具有共享儲存的模型。它假設有乙個無限大容量的共享儲存器,並且有多個功能相同的處理器,在任意時刻處理器可以訪問共享儲存單元。分類 根據是否可以同時讀寫,它又分為以下三類 pram e...
針對多核架構下的並行排序
在多核環境中,排序時如果仍然使用單核時代的序列排序演算法的話,那麼只能有乙個cpu核在執行,其他cpu核將得不到利用。因此多核環境中的排序一般需要用到並行排序演算法。並行排序演算法和序列排序演算法相比,會增加一些額外的開銷,如計算開銷或空間開銷。那麼在並行排序演算法中,有那些需求呢?下面給出一些並行...