KL1
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/26 09:42 UTC 版)
プラグマ
GHCで記述されたプログラムを効率よく並行・並列実行させるため、KL1では以下のプラグマが導入された。プログラムの正しさに影響を与えることなく負荷分散の仕方などを変えられるように設計されている。なお、プラグマはプログラムの正しさとは分離された効率のためだけの指定であり、これに従わない方が効率がいいと処理系が判断すると、必ずしも従わない場合もある。
* ゴール分散プラグマ Goal@node(Node) * ゴール優先度指定プラグマ Goal@priority(Priority) * 節優先度指定プラグマ alternatively.
ゴール分散プラグマは特定のゴール(プロセス)を実行するノードを指定する。ノードは個別のプロセッサ、あるいは負荷分散の対象となるプロセッサの集まりである。以下に、PEs 個のノードに対し N 個のspawnプロセスをサイクリックに割り当てる述語の例を示す。Prologと同様、英大文字や"_"で始まる項は変数を表す。%以降はコメントである。
:- module cyclic.
:- public distribute/1.
distribute(N):- true |
current_node(_,PEs), %ノードの総数PEsを取得
fork(N,PEs,0). %N個のプロセスをPEs個のノードで起動
fork(0,PEs,PE):- true | true.
otherwise.
fork(N,PEs,PE):- PeNo:=PE mod PEs |
spawn@node(PeNo), %PeNoのノードでspawnプロセスを起動
NextPE:=PE+1,
N1:=N-1,
fork(N1,PEs,NextPE).
ゴール優先度指定プラグマはゴール(プロセス)ごとの優先順位を指定する。ただし必ず優先順位を守ろうとすると効率的な実装が難しくなり、返って効率が落ちる可能性があるため、必ず守られるとは限らない。
節優先度指定プラグマはプログラムの構成要素である節(Clause)の優先順位である。節の優先順位の指定には、最初に優先したい節を先に書き、他の節との間に "alternatively."
を書く。ゴール優先度指定プラグマと同様の理由で、節の優先順位も必ず守られるとは限らない。
固有名詞の分類
- KL1のページへのリンク