• 検索結果がありません。

第 10 章

ドキュメント内 JAIST Repository (ページ 91-95)

チ転送モードでは、ネストしたデータ構造を1回にまとめて転送する.nCUBE2では通信 オーバヘッドが大きいため、バッチ転送モードの方が効率が良い場合が多い.しかし通信 時のタイミングしだいでは、データ構造が十分に構築されていないため必ずしも通信量が 減少しないことがある.以下の実験では特に断らない限りバッチ転送モードを用いる.

10.2

基礎性能測定

10.2.1

リダクションコストの測定

基礎データ測定用プログラムによれば、図10.1のような単純なループ処理であれば末尾 再帰呼出し(TRO)が効くため単一PE上で1.6 sec/reduction (約600K reduction/sec)

の性能が得られている.appendプログラムでSparcコード約20命令であるから、単純な ループであれば10MIPSのnCUBE2で2sec/reductionとなり、上の値は妥当である.図

10.2のような1演算ごとに値を順次リストで返すプログラムになると、命令数の増加から

3.3sec/reductionほどになる.

loop(N,X) :- N > 0, N1:=N-1 | loop(N1,X).

otherwise.

loop(_,X) :- X = [].

図10.1: リダクションコスト測定プログラム(単純なループ)

loop(N,X) :- N > 0, N1:=N-1 | X = [N|X1], loop(N1,X1).

otherwise.

loop(_,X) :- X = [].

図10.2: リダクションコスト測定プログラム(出力を含む)

図10.3が、実際の図10.1と図10.2のC命令セットの差分である.この内容は、N(a0)と 変数X1(x2)を含むリストセル[N|X1](x1)を割り付け、X(a1)とユニファイし、X1を

allocp[1] = a0;

x1 = makecons(&allocp[0]);

allocp += 2;

unify_value(a1, x1);

a1 = x2;

図10.3: 差分C命令

次の再帰呼出しの引数に設定する操作である.Sparcコードでは、これらの処理は11命令 になり、1sec程度の増加となりほぼ妥当な値である.

10.2.2

サスペンドリジュームコストの測定

次に図10.4は、ゴールsusp(X)がループ毎に一つサスペンドし次々にリジュームするプ ログラムである.

loop(R,N,X) :- N > 0 | R = 0, % 前のサイクルの束縛を解消する.

suspG(R1,X,X1), % R1が束縛されるまで待つ.

N1 := N-1, loop(R1,N1,X1). % R1は次のサイクルで束縛される.

otherwise.

loop(R,_,X) :- R = 0, X = [].

suspG(R,X,X1) :- wait(R) | X = X1. % サスペンドする.

suspG(R,X,X1) :- X = X1. % サスペンドしない.

図10.4: サスペンド リジュームコスト測定プログラム

述語loopの1回の実行サイクルにおいて、ゴールsuspGがその第一引数の未束縛のために サスペンドする.次のloop実行サイクルでsuspGのサスペンド原因が解消され、リジュー ムする.これに対して、suspGのクローズだけを 図10.4の下のボックスにあるクローズに 置き換えることで、サスペンドしないプログラムが得られる.これら二つのプログラムの

実行時間差から、サスペンド リジュームあたり165sec かかることが分かる.

10.2.3

コミュニケーションコストの測定

標準的なプロセス間コミュニケーションは図10.2のように変数ストリームへコンスセル をユニファイすることで行われる.コミュニケーション時間は、図10.5のプログラムによ り計測を行った.

?- server(Channel)@ node(1),

client(N,Channel,End)-Out @ node(0).

server([X|L]) :- X = 0, server(L).

server([]).

count(UT,Ch,End,N,K) :- integer(UT), K < N, K1:=K+1 |

Ch = [Next|Ch1],

count(Next,Ch1,End,N,K1).

otherwise.

count(UT,Ch,End,N,K) :- Ch = [], End = 0.

client(N,Ch,End)-O :- Ch=[Start|Ch1],

client1(Start,N,Ch1,End)-O.

client1(0,N,Ch,End)-O :- time(UserTime),

count(UserTime,Ch,E,N,1),

end(E,UserTime,End)-O.

end(0,UT,R)-O :- time(UT1),

O <= putt([~(UT1-UT)]), O <= nl, O <= fflush(R).

図10.5: コミュニケーションコスト測定プログラム

このプログラムの1サイクルは、図10.6のように実行される.

stage 0: PE0で動作するクライアントプロセスcountは、コンスセル[X1|X2]をXに束縛 することでサーバーに値を要求する.しかし変数XのセルがPE0上にあるためにコン スセルは実際にはまだ送られない.述語countの次のサイクルcount(X1,X2,..)は、

要求した値が来るまでサスペンドする.

stage 1: PE1で動作するサーバープロセスserver(X)は、クライアントから空のコンスセ ルが送られることにより動作する. 変数Xの実態はPE0にあるため、PE1からread

(値の要求)メッセージを送ってサスペンドする.

stage 2: read メッセージを受けとったPE0では、コンスセルは変数Xにすでに束縛して

いるので、answer(返信)メッセージによりPE0に送り返す.

PE0 PE1

ドキュメント内 JAIST Repository (ページ 91-95)