チ転送モードでは、ネストしたデータ構造を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に送り返す.