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

抽象機械命令の定義

ドキュメント内 JAIST Repository (ページ 34-37)

COPY

5.3 抽象機械命令の定義

sendReducedDataToParentPE( ParentPE, WaitAddr );

sendCommandToMaster( EXIT );

}

5.10: Exit命令のアルゴリズム

5.3.3 Wait

命令

Wait命令は,Forkした部分項の書換えの結果が全て戻って来るのを待つ.その定義は 図5.11のようになる.

Wait(){

if( proveMessageFromSlave() == TRUE ) getReducedTerm();

if( NumOfFORK == 0 ) return;

sendCommandToMaster( WAIT );

while( TRUE ){

if( proveMessageFromMaster() == TRUE ){

command getMessageFromMaster() break;

}

if( proveMessageFromSlave() == TRUE ) getReducedTerm();

}

switch( command ){

case Awake:

return;

case Reduce:

getData();

break;

}

}

5.11: Wait命令のアルゴリズム

まず,proveMessageFromSlaveでFORKした書換えの結果が戻って来ているかを調べ,

戻って来ていればgetReducedTermでそれを受け取る.そして,このWaitの持つ

NumOf-Forkが0ならFORKした書換えが全て戻って来ているので,Wait命令の処理を抜ける.

そうでないときは,MasterWAITコマンドを送り,Wait状態に入った事を知らせる.

そして,MasterからAwakeコマンドかReduceコマンドが送られて来るのを待つが,こ

の時同時にFORKした書換えが戻って来ているかのチェックと,その受け取りの処理を行

う.これは,5.3.3で説明したように,子プロセスでは書換え結果を親プロセスに返してか らIdle状態へと移るため,Wait命令のこの待ち状態の時に受け取りの処理を行わないと,

デッドロックを起こしてしまうからである.Masterからコマンドを受け取ると,Awake コマンドならこのままWait命令を抜け,またReduceコマンドなら他のプロセスから部 分項を受け取り,Wait命令を抜け,それぞれ書換えを再開する.

5.3.4 Sleep

命令

Sleep命令は,Master から次に行うべき命令が送られて来るのを待つ.Master では,

Sleep状態のSlaveIdlePro cessとして扱う.その定義は図5.12のようになる.

Sleep(){

command getMessageFromMaster();

switch( command ){

case Initialize:

programFile getFileName();

CompileProgram( programFile );

break;

case ReduceInputTerm:

changeSleepToBingo();

getData();

break;

case ReduceSubTerm:

getData();

break;

case Quit:

return;

}

}

5.12: Sleep命令のアルゴリズム

Sleep命令ではMasterからのコマンドを受け付ける.コマンドはInitialize

ReduceIn-puTerm,ReduceSubTerm,Quit4種類がある.各コマンドの動作は以下のようになる.

Initialize 書換え規則のコンパイルを行う.Masterから入力された書換え規則のファイ

ル名を受け取り,そのファイルを読み込み,コンパイルを行う.

ReduceInputTerm 入力項の書換えを行う.まず,全てのSlaveの戦略リストのBottom

にはSleep命令があり,それを実行してこの命令に処理が移っている.このコマン

ドを受け取ったSlaveは,changeSleepToBingoで戦略リストのBottomを入力項の 書換えの終了を表すBingoに変更し,getDataで入力項をコンパイルして得られた コードと戦略リストを受け取り,CODESLの各領域に配置した後,Sleep命令の 処理を抜ける事で,入力項の書換えが始まる.

ReduceSubTerm 部分項の書換えを行う.部分項を割り付けて来る親Slaveからデータ

を受け取り,Sleep命令を抜ける事で,部分項の書換えが始まる.

Quit 超並列TRAMの処理を終了する.

ドキュメント内 JAIST Repository (ページ 34-37)

関連したドキュメント