next up previous contents
Next: 暇なノードへの動的割り付け Up: 4.8 ゴール分散の指定方法 Previous: サイクリック割り付け

ランダム割り付け

ノードをサイクリックに割り付けると, 規則性のあるプログラムでは 特定のノードに負荷が集中してしまう場合がある. それを回避する一つの 割り付け手法がランダム割り付けである. 割り付けるノードの番号を 乱数によって決める手法である. 次に示したプログラムは spawn プロセスを 100 個擬似乱数を使ってノードに割り付けた例である.

:- module foo.

        distribute(N):- true |                  %(1)
                current_node(_,PEs),            %(2)
                random(Rs,23,PEs),              %(3)
                fork(N,Rs).                     %(4)
        fork(0,Rs):- true | Rs=[].              %(5)
     otherwise.
        fork(N,Rs):- true |                     %(6)
                Rs=[get(PeNo)|NewRs],           %(7)
                spawn@node(PeNo),               %(8)
                N1:=N-1,                        %(9)
                fork(N1,NewRs).                 %(10)
        random([get(Rnd)|RS],Seed,R):- true |   %(11)
                Rnd:= Seed mod R,               %(12)
                NewSeed:=(125*Seed+1) mod 4096, %(13)
                random(RS,NewSeed,R).           %(14)
        random([],_,_):- true | true.           %(15)

(16)のようにゴールを呼び出すと, 100 ノードの環境であれば, (7)の部分で乱数生成プロセスから0から99までの一様乱数を得, (8)の部分でノードの割り付けを行なう. この例の場合では, ノードは 23, 76, 49, 10, 99, 32, と 割り付けられる.



next up previous contents
Next: 暇なノードへの動的割り付け Up: 4.8 ゴール分散の指定方法 Previous: サイクリック割り付け



KLIC