SCore-D ランタイム開発

このドキュメントでは SCore-D ランタイムライブラリを開発するためのスケルトンコードについて記述しています。

ユーザ定義関数

全てのランタイムライブラリは以下の二つの関数を実装する必要があります:

int score_runtime_resource(void);
void score_runtime_usage(void);

score_runtime_resource() はユーザプログラムまたはランタイムライブラリで実装されなければならないコールバック関数です。この関数は scrun(1) の SCore オプションでユーザが指定したリソースをチェックするのに使用されます。score_runtime_usage() はランタイムの使用法を表示するために実装されなければならないコールバック関数です。

初期化

最初に scrun(1) がコマンドラインで指定されたユーザプログラムを、ユーザの指定したリソース要求を解析し、その要求が有効であるかどうかをチェックするために scrun が起動されたホスト上で呼び出します。これは、ランタイムがリソース要求をチェックすることができるように、(プログラマによって書かれた) score_runtime_resource() 関数が呼び出される score_initialize() 関数の中で行われます。この関数がゼロでない値を返した場合、ユーザプログラムの起動は中止され、そうでない場合には scrun が SCore-D へのログインを試みます。

SCore-D へのログインが成功した後、SCore-D は割り当てられたクラスタノード上でユーザプログラムを fork および exec します。ここで、score_initialize() が再び各ノード上で呼び出されます。全てのランタイムライブラリは、<score.h> で定義されている変数にアクセスしたり PM ライブラリを介して通信を行ったりする前に score_initialize() 関数を呼ばなければなりません。score_initialize() 関数では、SCore-D から渡された情報に従って PM コンテキストを初期化し、他のノードとの通信を可能にします。

#include <score.h>
void my_runtime_initialize(int argc, char **argv) {
  score_initialize(argc, argv);
  /* score_initialize() does not return, when this program is 
     invoked on a local host. */
  /* When a user program is invoked on one or more cluster nodes,
     the program can reach this point, and the runtime can
     initialize itself. */
}

リソースのチェック

ランタイムライブラリはユーザプログラムをクラスタ上で実行する前にユーザの指定したリソース要求をチェックします。ユーザの指定したリソース要求は関数 score_get_resource_request() を呼ぶことで得られます:
#include <score_resource.h>
int score_runtime_resource(void) {
  scoreResourceRequest *rsrc = score_get_resource_request();
	:
  return( 0 );
}
また、リソース要求に制約を加えるための リソースマクロ があります。

Idle フラグの設定

関数 score_become_idle() および score_become_busy() はユーザプロセスの実行状態を SCore-D に知らせます。ユーザプログラムが idle である場合には、たとえ実際にはビジーウェイトしているときでも、score_become_idle() を呼び出し、プロセスが busy になろうとしたら score_become_busy() を呼び出すことが望ましいです。ユーザプロセスの状態を正しく知らせることで、SCore-D はユーザ並列プロセス 全体の 状態を知ることができます。SCore-D は、プロセス全体が idle である場合にはあまりスケジュールせず、またプロセス全体がデッドロックしていると思われる場合にはプロセスを kill します。pmReleaseReceiveBuffer() を呼んでメッセージバッファを開放すること、およびそのタイミングは大変重要です。
void idle_loop( void ) {
  caddr_t buf;
  size_t size
  while( pmReceive( score_pmnet[0], &buf, &size ) == ENOBUF ) {
    score_become_idle();
  }
  score_become_busy();
  process_received_message( buf, size );
  pmReleaseReceiveBuffer( score_pmnet[0] );
  return;
}
上の例のように、pmReleaseReceiveBuffer() でメッセージバッファを開放するに、関数 score_become_busy() を呼ばなければなりません。そうでない場合、ユーザ並列プロセスが間違って SCore-D によってスケジュールされなかったり kill されたりする可能性があります。

使用法

#include <score_usage.h>
void score_runtime_usage(void) {
  score_separate_usage("My-Runtime");
  score_print_usage("magic", "NN", "magic number");
	:
}
言語ランタイムの使用法を表示するためのこのサンプルコードは、以下のようなメッセージを生成します:

-- My-Runtime --
  magic=NN  magic number

関連項目

scrun(1), score_initialize(3), score_runtime_resource(3), score_become_idle(3), score_become_busy(3), resource macros


CREDIT
This document is a part of the SCore cluster system software developed at PC Cluster Consortium, Japan. Copyright (C) 2003 PC Cluster Consortium.