[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8. ユニット

ユニットはハードウェアの機能ブロックを表現する。クロック入力に同期して 動作するユニットを同期ユニット、パケット到着時に動作するユニットを非同 期ユニットと呼ぶ。以下の実装済ユニットは、ほとんどが同期ユニットである。

8.1 unitクラス  
8.2 asynchronous_unitクラス  
8.3 synchronous_unitクラス  
8.4 synchronous_unit_setクラス  
8.5 processorクラス  
8.6 memory_control_unitクラス  
8.7 fetch_and_dec_control_unitクラス  
8.8 halt_detectorクラス  
8.9 bus_error_detectorクラス  
8.10 timerクラス  
8.11 tracewriter_unitクラス  
8.12 comm_io_unitクラス  
8.13 multi_io_unitクラス  
8.14 routerクラス  
8.15 deterministic_routerクラス  
8.16 duato_routerクラス  
8.17 network_interfaceクラス  
8.18 dummy_network_interfaceクラス  
8.19 single_processing_elementクラス  
8.20 generic_processing_elementクラス  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.1 unitクラス

すべての状態遷移を行う機能ブロック(ユニット)のクラスの基底クラス。ユニッ トを表すクラスは全てこのクラスの派生クラスとして実装される。 unit クラスは抽象クラスであり、その派生クラスに対して状態の初期 化(リセット)機能のインタフェースを規定する働きを持つ。 asynchronous_unitsynchronous_unitの基底クラスとしての み使用される。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.2 asynchronous_unitクラス

パケット入力によって状態遷移を行うユニット(非同期ユニット)のクラスの基 底クラス。非同期ユニットを表すクラスは全てこのクラスの派生クラスとして 実装される。同期ユニットと異なり、クロック入力ではなくパケットの到着に よって起動される。そのため、到着パケットに対して遅延なしで応答するハー ドウェアユニットを実装することができる。asynchronous_unitクラス は抽象クラスであり、その派生クラスに対して活性化機能のインタフェースを 規定する働きを持つ。

asynchronous_unitクラスは以下の純粋仮想関数を持つ。具体派生クラ スは全ての純粋仮想関数に定義を与える必要がある。また、 asynchronous_unitクラスはroot_objectクラスの派生クラスと して実装されているため、root_objectクラスの仮想関数も実装する必要があ る。See section 4.1 root_objectクラス.

void activate(port&)
引数で示されたポートからのパケット入力による活性化を行う。この関数は portクラスのオブジェクトから自動的に呼ばれる関数であるため、不 用意に呼び出しを行ってはならない。

void reset(void)
オブジェクトの状態を初期化する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.3 synchronous_unitクラス

クロック入力によって状態遷移を行うユニット(同期ユニット)のクラスの基底 クラス。同期ユニットを表すクラスは全てこのクラスの派生クラスとして実装 される。synchronous_unitクラスは抽象クラスであり、その派生クラ スに対して状態遷移(クロック入力)、状態の初期化(リセット)機能のインタ フェースを規定する働きを持つ。

状態遷移関数は2つあり、交互に呼び出されることによって状態遷移を行う。1 つは外部からの情報入力フェーズ、もう1つは外部への情報出力フェーズを実 行する。情報の入出力はportクラスのオブジェクトによって行われる。

synchronous_unitクラスは以下の純粋仮想関数を持つ。派生クラスは 全ての純粋仮想関数に定義を与える必要がある。また、 synchronous_unit クラスはroot_objectクラスの派生クラスとして実 装されているため、root_objectクラスの仮想関数も実装する必要があ る。See section 4.1 root_objectクラス.

void clock_in(void)
オブジェクトの状態遷移を行う。この関数では外部からの入力のみが行われ、 外部への出力を行ってはならない。

void clock_out(void)
オブジェクトの状態遷移を行う。この関数では外部への出力のみが行われ、外 部から入力を行ってはならない。

void reset(void)
オブジェクトの状態を初期化する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4 synchronous_unit_setクラス

同期ユニットの集合をまとめて単一の同期ユニットとして扱うためのユニット。 プロセシングユニットなどの実装に用いられる。内部に同期ユニットへのポイ ンタのリストを持っており、リスト内に登録された同期ユニットへのクロック の分配、リセットの分配を行う。

以下の4つのprotectedメンバ関数が派生クラスのために用意されている。派生 クラスは、以下の関数を用いて同期ユニットとしての機能を整える。

void insert_synchronous_unit(synchronous_unit&)
引数で示される同期ユニットを追加する。

void erase_synchronous_unit(synchronous_unit&)
引数で示される同期ユニットを削除する。

void insert_synchronous_unit_set(synchronous_unit_set&)
引数で示される同期ユニット集合を追加する。

void erase_synchronous_unit_set(synchronous_unit_set&)
引数で示される同期ユニット集合を削除する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.5 processorクラス

プロセッサを表す抽象クラス。全てのプロセッサの基底クラスとなる。このク ラス自身がsingle_port_synchronous_unitクラスの派生クラスなので、 実際のプロセッサクラスの実装者はsingle_port_synchronous_unitク ラスの純粋仮想関数と以下の純粋仮想関数を定義する必要がある。

virtual data_type register_file(size_t) const
引数で示されるレジスタを参照する。

virtual address_type program_counter(void) const
プログラムカウンタを参照する。

virtual bool is_halt(void) const
プロセッサがホールトしている場合に真を返す。

virtual bool is_stall(void) const
プロセッサがストールしている場合に真を返す。

virtual bool is_reading(void) const
プロセッサがreadアクセスをしている場合に真を返す。

virtual bool is_writing(void) const
プロセッサがwriteアクセスをしている場合に真を返す。

virtual bool is_user_mode(void) const
プロセッサがユーザモードで動作している場合に真を返す。

virtual bool is_kernel_mode(void) const
プロセッサがカーネルモードで動作している場合に真を返す。

virtual void halt(void)
プロセッサを強制的にホールトさせる。

virtual size_t frequency_magnification(void) const
バスクロックに対するCPU周波数の倍率を返す。

virtual void set_frequency_magnification(size_t)
バスクロックに対するCPU周波数の倍率を設定する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.6 memory_control_unitクラス

メモリコントローラに相当するクラス。mapped_memoryクラスを接続す ることで、一次記憶装置を構成することができる。アクセスには bus_portクラスを使用する。単一ワード転送、バースト転送、スプリッ トトランザクションを行うことができる。また、リードアクセス時間、ライト アクセス時間を個別に設定できる。

unsigned int read_wait(void) const
リードアクセス時間を返す。

unsigned int write_wait(void) const
ライトアクセス時間を返す。

void set_read_wait(unsigned int)
リードアクセス時間を設定する。

void set_write_wait(unsigned int)
ライトアクセス時間を設定する。

bool is_connected_to_memory(void) const
メモリに接続されていれば真を返す。

void connect_memory(memory_type&)
引数で示されたメモリを接続する。

void disconnect_memory(void)
メモリを切り離す。

void enable_split_transaction(void)
スプリットトランザクションを使用する。

void disable_split_transaction(void)
スプリットトランザクションを使用しない。

また、継承クラスでFetch and Decrement不可分命令をサポートするようなメ モリコントローラを実装できるよう、以下の限定公開関数が仮想関数化されて いる。

data_type read(address_type)
メモリの内容を読み取る。
void write(address_type, data_type)
メモリに書き込む。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.7 fetch_and_dec_control_unitクラス

メモリコントローラに相当するクラス。read要求に対しては、Fetch and Decrementを行う。memory_control_unitクラスの派生クラスで、使用 方法はmemory_control_unitと同一。See section 8.6 memory_control_unitクラス.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.8 halt_detectorクラス

システムの停止を検出するためのクラス。あらかじめ設定されたある特定のア ドレスへの書き込み要求を監視し、要求が発生するとそれを検出する簡単な同 期ユニットである。この特定のアドレスへの書き込みを「システム停止命令」 として定義することで、ソフトウェア側からのシステム停止命令の送信とシミュ レータ側でのシステム停止の検出を容易に行うことができる。

void set_address(address_type)
監視するアドレスを設定する。

address_type address(void) const
監視するアドレスを返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.9 bus_error_detectorクラス

バスエラーの停止を検出するためのクラス。バス上に同一アドレスへの要求が 一定時間送信されたままになった場合をバスエラーと見なす。

void set_timeout(unsigned int)
タイムアウトと見なすクロック数を設定する。

bool is_bus_error(void) const
バスエラーが発生していれば真を返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.10 timerクラス

タイマを表すクラス。内部にカウンタを1つ持ち、クロック入力毎にその値を インクリメントする。このユニットを用いることで、シミュレータ上のソフト ウェアでシミュレーション単位時間での実行時間計測を行える。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.11 tracewriter_unitクラス

発行されたメモリアクセスをトレースし、アドレストレースファイルへ出力す るためのクラス。接続されたバス上のパケットを監視し、設定されたアドレス 範囲へのリード要求およびライト要求を待つ。アクセス要求を検出すると、接 続されたストリームへ時刻、プロセッサ番号、アクセスの種類、アドレスをテ キスト形式で出力する。値はすべて16進数である。プロセッサ番号は、設定さ れたID番号があればそのID番号、なければバスのオーナID番号が使用される。

int id(void) const
設定されたID番号を返す。

bool is_valid_address(address_type) const
引数で示されたアドレスがトレース出力を行うアドレス範囲内であれば真を返 す。

void set_id(int)
ID番号を設定する。

void reset_id(void)
設定したID番号を解除する。

void set_valid_address(address_type, size_type)
監視するアドレス範囲を、第一引数で示された先頭アドレスから第二引数で示 されたサイズの領域に設定する。

void connect_stream(ostream&)
トレース出力を行うストリームを設定する。

void disconnect_stream(void)
トレース出力を行うストリームを切り離す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.12 comm_io_unitクラス

シミュレートされる計算機とシミュレータ間の通信を仲介するユニットである。 このユニットを介してキャラクタベースの半二重の通信路が確保される。シミュ レートされる計算機との通信は、mapped_memoryクラスのアドレス空間 の一部を通信デバイスのハードウェアレジスタとして使用することにより行わ れる。シミュレータ上で動作するソフトウェアは、特定のアドレスに対してリー ド/ライトをすることによって通信を制御する。

シミュレータ側の処理は、comm_io_unit内部の送信キューと受信キュー を操作することによって行われる。ユーザはキューにアクセスすることで通信 を制御する。

ソフトウェア側の処理はOSIRISライブラリ内のsend_to_hostreceive_from_host関数によって行われるため、ユーザが実際の通信プ ロトコルを意識する必要はない。

このクラスは他のユニットの一部として動作するよう設計されている。ハード ウェアレジスタに対するアクセス要求そのものは処理しないので、このクラス のオブジェクト以外のユニットでメモリアクセスを処理しなければならない。

8.12.1 comm_io_unitクラスの定義  
8.12.2 comm_io_unitクラスのレジスタ  
8.12.3 comm_io_unitクラスの通信プロトコル  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.12.1 comm_io_unitクラスの定義

comm_io_unit(address_type, size_type)
使用するハードウェアレジスタのアドレスとサイズを指定してオブジェクトを 構築する。第一引数にアドレス、第二引数にサイズを取る。

void set_address(address_type, size_type)
使用するハードウェアレジスタのアドレスとサイズを指定する。第一引数にア ドレス、第二引数にサイズを取る。

bool is_big_endian(void) const
ハードウェアレジスタがビッグエンディアンに設定されていれば真を返す。

bool is_little_endian(void) const
ハードウェアレジスタがリトルエンディアンに設定されていれば真を返す。

void set_big_endian(void)
ハードウェアレジスタをビッグエンディアンに設定する。

void set_little_endian(void)
ハードウェアレジスタをリトルエンディアンに設定する。

bool can_put(void) const
データを送信できる状態なら真を返す。

bool can_get(void) const
データを受信できる状態なら真を返す。

void put(char_type)
文字を送信する。

char_type get(void)
文字を受信する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.12.2 comm_io_unitクラスのレジスタ

comm_io_unitクラスは、シミュレートされる計算機との通信をハード ウェアレジスタを介して行う。使用されるハードウェアレジスタは次の4つで ある。

最大データサイズ(1ワード)
パケットに格納できる最大文字サイズ。

ヘッダ(1ワード)
メッセージの種類を格納するレジスタ。

パケットサイズ(1ワード)
メッセージの大きさ(単位はバイト)を格納するレジスタ。

データ(nバイト)
メッセージ本体。

これらのレジスタは、setup関数でハードウェアレジスタの初期化を行った際 に配置される。その配置は以下の通りである。

最大データサイズ
+0

ヘッダ
+ sizeof(data_type)

パケットサイズ
+ sizeof(data_type) * 2

データ
+ sizeof(data_type) * 3


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.12.3 comm_io_unitクラスの通信プロトコル

シミュレートされる計算機とシミュレータとの通信は、計算機がハードウェア レジスタにアクセスすることにより起動される。データの送受信には、ハード ウェアレジスタの他に、シミュレータ側に用意された送信キュー、受信キュー が使用される。

パケットの型を決定するヘッダの値は、ヘッダファイル`io_protocol.h' で定義されている。このファイルはシミュレータのコンパイル、シミュレート されるソフトウェアのコンパイルの両方で共用される。

以下のソフトウェア側の処理は、OSIRISライブラリ内のsend_to_hostreceive_from_host関数によって行われるため、ユーザがこの通信プロ トコルを意識する必要はない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.13 multi_io_unitクラス

単一ユニットでいくつかの入出力機能を同時にサービスするユニットである。 このユニットを用いることで、システム停止要求の検出、sysinfo_map による連想配列データベース、fileio_mapによるファイル入出力、 argument_mapによるコマンドライン引数の参照と終了ステータスの通 知、時刻計測を行うことができる。

ソフトウェア側の処理はOSIRISライブラリ内の一連のmulti_io_unit用 の通信ライブラリ関数によって行われるため、ユーザが実際の通信プロトコル を意識する必要はない。

8.13.1 multi_io_unitクラスの定義  
8.13.2 multi_io_unitクラスの通信プロトコル  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.13.1 multi_io_unitクラスの定義

void set_address(address_type, size_type)
使用するハードウェアレジスタのアドレスとサイズを指定する。第一引数にア ドレス、第二引数にサイズを取る。

bool is_halt(void) const
システム停止信号を受信していれば真を返す。

bool is_defined_sysinfo(const string&) const
引数で指定されたkeyを持つ情報がsysinfo連想配列内で定義されていれば真を 返す。

bool is_defined_integer_sysinfo(const string&) const
引数で指定されたkeyを持つ情報がsysinfo連想配列内で整数として定義されて いれば真を返す。

bool is_defined_string_sysinfo(const string&) const
引数で指定されたkeyを持つ情報がsysinfo連想配列内で文字列として定義され ていれば真を返す。

data_type get_integer_sysinfo(const string&) const
引数で指定されたkeyを持つsysinfo連想配列内の整数情報の値を返す。

const string& get_string_sysinfo(const string&) const
引数で指定されたkeyを持つsysinfo連想配列内の文字列情報の値を返す。

void set_sysinfo(const string&, data_type)
第一引数で指定されたkey、第二引数で指定された整数値をsysinfo連想配列に 登録する。

void set_sysinfo(const string&, const string&)
第一引数で指定されたkey、第二引数で指定された文字列値をsysinfo連想配列 に登録する。

void unset_sysinfo(const string&)
引数で指定されたkeyの情報をsysinfo連想配列から削除する。

void set_file_table_size(size_t)
扱うことができるファイル数を指定する。

void set_file_input_stream(size_t, istream&)
第一引数で示されるファイルテーブルのエントリに、第二引数で示される入力 ストリームを結び付ける。

void set_file_output_stream(size_t, ostream&)
第一引数で示されるファイルテーブルのエントリに、第二引数で示される出力 ストリームを結び付ける。

unsigned long timer_clock_value(void) const
現在の時刻を得る。

int commandline_argc(void) const
コマンドライン引数の個数を得る。

const char* commandline_argv(size_t) const
引数で指定されたコマンドライン引数を参照する。

void set_commandline_argument(const char* const*)
コマンドライン引数を設定する。

void commandline_status(void) const
終了ステータスを得る。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.13.2 multi_io_unitクラスの通信プロトコル

シミュレータ上で動作するソフトウェアは、以下の通信プロトコルにしたがっ てmulti_io_unitと通信を行うことで様々な入出力を行う。通信プロト コルに用いられる定数は`io_protocol.h'に定義されている。

また、一連の通信プロトコルはcomm_io_unitによる仮想的なキャラク タベースの通信路上に確保されているので、下位の通信プロトコルとして comm_io_unit用の通信プロトコルを用いなければならない。 See section 8.12.3 comm_io_unitクラスの通信プロトコル.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.14 routerクラス

相互結合網を構成するルータを表す抽象クラス。このクラスは抽象クラスであ り、すべてのルータはこのクラスの派生クラスとして実装される。

設定したチャネル数の入力チャネルと出力チャネルがあり、それぞれのチャネ ルは仮想チャネル構成になっている。また内部には、入力物理チャネルと出力 物理チャネル間を結ぶクロスバ、各入力仮想チャネルそれぞれに対するチャネ ルコントローラ、各出力仮想チャネルそれぞれに対するロックフラグテーブル を持つ。また、状態監視のために、ルータ内部を通過した総パケット数を保持 するカウンタを持つ。

すべてのルータは、routerの公開インタフェースを通じて使用される。また、 派生クラスの機能は、routerで定義されている限定公開メンバを含む仮想関数 を再定義することで実装される。

8.14.1 routerの公開インタフェース  
8.14.2 routerの限定公開インタフェース  
8.14.3 ルータ内部のチャネルコントローラ  
8.14.4 新しいルータの作成手順  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.14.1 routerの公開インタフェース

virtual void setup(void)
ルータを使用可能な状態にする。すべての入出力チャネルを接続し、必要があ れば内部状態を使用可能状態に設定した上で呼び出さなければならない。

virtual void reset_counter(void)
ルータ内部のカウンタをすべて初期化する。

virtual_channel_input& input_channel(size_t)
入力チャネルを参照する。

virtual_channel_output& output_channel(size_t)
出力チャネルを参照する。

node_address_type node_address(void) const
ノードアドレスを参照する。

void set_node_address(node_address_type)
ノードアドレスを設定する。

size_t input_size(void) const
入力チャネル数を得る。

size_t output_size(void) const
出力チャネル数を得る。

size_t channel_size(size_t) const
引数で示された入力チャネルの仮想チャネル数を得る。

size_t buffer_size(size_t) const
引数で示された入力チャネルの最大バッファ長を得る。

size_t buffer_length(size_t) const
引数で示された入力チャネルのバッファ長を得る。

void set_channel_size(size_t, size_t)
第一引数で示された入力チャネルの仮想チャネル数を第二引数で示された値に 設定する。

void set_buffer_size(size_t, size_t)
第一引数で示された入力チャネルの最大バッファ長を第二引数で示された値に 設定する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.14.2 routerの限定公開インタフェース

channel_controller& internal_controller(size_t, size_t)
第一引数で示される入力物理チャネルの、第二引数で示される仮想チャネルに 対するチャネルコントローラを参照する。

crossbar& internal_crossbar(void)
内部クロスバを参照する。

bool is_locked_output_virtual_channel(size_t, size_t)
第一引数で示される出力物理チャネルの、第二引数で示される仮想チャネルに 対するフラグがロックされていれば真を返す。

void lock_output_virtual_channel(size_t, size_t)
第一引数で示される出力物理チャネルの、第二引数で示される仮想チャネルに 対するフラグをロックする。

bool unlock_output_virtual_channel(size_t, size_t)
第一引数で示される出力物理チャネルの、第二引数で示される仮想チャネルに 対するフラグをアンロックする。

void set_input_size(size_t)
入力物理チャネル数を設定する。

void set_output_size(size_t)
出力物理チャネル数を設定する。

void increment_total_hop_count(void)
総通過パケット数をインクリメントする。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.14.3 ルータ内部のチャネルコントローラ

ルータ内部の入力仮想チャネル制御コントローラは、それ自体がクラスとして 実装されている。チャネルコントローラは内部に以下の値/状態を保持してい る。

チャネルコントローラ動作の基本となるのは「状態」で、以下のように3状態 を順番に繰り返すことでパケット転送を行なう。また、転送状態にある時は active/inactiveの副状態を持つ。

  1. 新しいパケットが入力チャネルに到着するまで待機状態で待つ。

  2. 新しいパケットが到着したら、ルータ内部の状態や他のパケットを考慮した上 でルーティングを行なう。宛先が決定したら、残り転送フリット数にパケット 長を、出力先チャネル番号テーブルに宛先チャネル番号を設定し、転送待ち状 態に遷移する。状況によってはそのまま転送状態に遷移しても良い。

  3. 出力可能状態になったら、転送状態に遷移する。次回動作時にフリットを転送 するならactive、出力先仮想チャネルに空きがないなどの理由で転送しないな らinactiveという副状態を指定する。パケット全体の転送が終了したら待機状 態に戻る。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.14.4 新しいルータの作成手順

新たなルータを作成する場合は、routerクラスで定義されている以下の純粋仮 想関数を定義しなければならない。

clock_in
clock_out
状態遷移時の動作を記述する。

setup
ルータが動作可能なように内部状態を設定する。

reset
ルータの内部状態を初期化する。

これらの関数をすべて1つの派生クラスで記述するのは繁雑である。この作業 を簡略化させる目的で、deterministic_routerクラスと duato_routerクラスが定義されている。See section duato_router class.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.15 deterministic_routerクラス

送信ノードアドレスと受信ノードアドレスから、パケットの経路が一意に決定 するルーティングを行なうルータの基底クラスである。このクラスは routerクラスの派生クラスで、routerクラスで未定義であった clock_in, clock_out, setup, reset関数が定 義されている。派生クラスでは、仮想関数routingのみを定義すれば良 い。

void routing(const packet_type&, channel_controller&)
第一引数で示されたパケットに対するルーティングを行なう。第二引数は、パ ケットが到着した入力仮想チャネルに対応したチャネルコントローラである。 この関数内で、パケットに示された情報とチャネルコントローラに示された入 力チャネル情報を元にルーティングを行ない、その結果得られた出力仮想チャ ネル番号をチャネルコントローラに設定する必要がある。

このクラスは、クロック入力ごとに以下の順序で処理を行なう。

[clock_in] select_output_virtual_channel
すべての入力仮想チャネルを調べ、新たにパケットが到着しているチャネルの チャネルコントローラに対してルーティング処理を行ない、転送待ち状態にす る。

[clock_in] arbitrate_output_virtual_channel
転送待ち状態になっていて出力先が競合しているすべての入力仮想チャネルに ついて、出力仮想チャネル確保のためのアービトレーションを行なう。優先度 制御はラウンドロビンである。出力仮想チャネルを確保した入力仮想チャネル のコントローラは、転送状態になる。

[clock_in] arbitrate_output_physical_channel
転送状態にあるすべての入力仮想チャネルについての、出力物理チャネル確保 のためのアービトレーションを行なう。優先度制御はラウンドロビンである。 出力物理チャネルを確保した入力仮想チャネルのコントローラは、active状態 になる。確保できなかったコントローラはinactive状態になる。転送割り当て に対応するよう内部クロスバの状態を変更する。

[clock_out] transmit_packet
転送状態でかつactive状態にあるコントローラについて、フリットの転送処理 を行なう。パケットが通過し終わったコントローラは待ち状態に遷移する。ま た、転送状態のままのコントローラも、すべてinactive状態になる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.16 duato_routerクラス

Duatoの必要十分条件に基づいて、適応ルーティングとエスケープパスルーティ ングを行なうルータの基底クラスである。このクラスはrouterクラスの派生ク ラスで、routerクラスで未定義であったclock_in, clock_out, setup, reset が定義されている。派生クラスでは、仮想関数adaptive_routingと escape_routingを定義する必要がある。

void adaptive_routing(const packet_type&, channel_controller&)
第一引数で示されたパケットに対する適応ルーティングを行なう。第二引数は、 パケットが到着した入力仮想チャネルに対応したチャネルコントローラである。 この関数内で適応ルーティングを行ない、その結果得られた出力仮想チャネル 番号をチャネルコントローラに設定し、さらに出力先の仮想チャネルをロック する。そのパケットを適応ルーティングで転送しない場合は、何もしないまま 終了すること。

void escape_routing(const packet_type&, channel_controller&)
第一引数で示されたパケットに対するエスケープパスルーティングを行なう。 第二引数は、パケットが到着した入力仮想チャネルに対応したチャネルコント ローラである。この関数内でエスケープパスルーティングを行ない、その結果 得られた出力仮想チャネル番号をチャネルコントローラに設定する。 adaptive_routing 関数と違い、出力先の仮想チャネルをロックする必要はな い。

このクラスは、クロック入力ごとに以下の順序で処理を行なう。

[clock_in] arbitrate_output_channel_for_adaptive
すべての入力仮想チャネルを調べ、新たにパケットが到着しているチャネルの チャネルコントローラに対して適応ルーティング処理を行なう。適応ルーティ ングを行なうコントローラは直接転送状態に遷移する。

[clock_in] select_output_virtual_channel
すべての入力仮想チャネルを調べ、新たにパケットが到着しているチャネルの チャネルコントローラに対してエスケープパスルーティング処理を行ない、転 送待ち状態にする。

[clock_in] arbitrate_output_virtual_channel
転送待ち状態になっていて出力先が競合しているすべての入力仮想チャネルに ついて、出力仮想チャネル確保のためのアービトレーションを行なう。優先度 制御はラウンドロビンである。出力仮想チャネルを確保した入力仮想チャネル のコントローラは、転送状態になる。

[clock_in] arbitrate_output_physical_channel
転送状態にあるすべての入力仮想チャネルについての、出力物理チャネル確保 のためのアービトレーションを行なう。優先度制御はラウンドロビンである。 出力物理チャネルを確保した入力仮想チャネルのコントローラは、active状態 になる。確保できなかったコントローラはinactive状態になる。転送割り当て に対応するよう内部クロスバの状態を変更する。

[clock_out] transmit_packet
転送状態でかつactive状態にあるコントローラについて、フリットの転送処理 を行なう。パケットが通過し終わったコントローラは待ち状態に遷移する。ま た、転送状態のままのコントローラも、すべてinactive状態になる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.17 network_interfaceクラス

ネットワークインタフェースを表す同期ユニットである。ルータに接続して動 作させる。このクラスは抽象クラスではないが、公開インタフェースにパケッ トの送信と受信機能が用意されていないため、実際のネットワークインタフェー スを実装するためには派生クラスを用いる。

1つの入力チャネルと1つの出力チャネル、指定した大きさの送信キューと受信 キューを持つ。また、状態監視のために、送信した総パケット数と総フリット 数、受信した総パケット数と総フリット数、受信したパケットの遅延の総計を 保持するカウンタを持つ。

パケットの転送遅延を測定するために、内部に現在の時刻を保持している。現 在の実装では、システム内に存在するすべてのネットワークインタフェースの 時刻を一致させないと、パケットの転送遅延を測定することはできない。

8.17.1 network_interfaceの公開インタフェース  
8.17.2 network_interfaceの限定公開インタフェース  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.17.1 network_interfaceの公開インタフェース

size_t send_queue_size(void) const
送信キューの大きさを得る。

void set_send_queue_size(size_t)
送信キューの大きさを設定する。

size_t receive_queue_size(void) const
受信キューの大きさを得る。

void set_receive_queue_size(size_t)
受信キューの大きさを設定する。

size_t send_queue_length(void) const
送信キュー内の待ちパケット数を得る。

size_t receive_queue_length(void) const
受信キュー内の待ちパケット数を得る。

const virtual_channel_input& input_channel(void) const
入力仮想チャネルを参照する。

const virtual_channel_output& output_channel(void) const
出力仮想チャネルを参照する。

node_address_type node_address(void) const
ノードアドレスを参照する。

void set_node_address(node_address_type)
ノードアドレスを設定する。

size_t send_packet_count(void) const
送信した総パケット数を得る。

size_t send_flit_count(void) const
送信した総フリット数を得る。

size_t receive_packet_count(void) const
受信した総パケット数を得る。

size_t receive_flit_count(void) const
受信した総フリット数を得る。

timestamp_type total_latency(void) const
受信したパケットの遅延の総計を得る。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.17.2 network_interfaceの限定公開インタフェース

bool is_ready_to_enqueue(void) const
パケットを送信キューに投入可能なら真を返す。

bool is_ready_to_dequeue(void) const
パケットを受信キューから取り出し可能なら真を返す。

void enqueue_send_packet(packet_type*)
パケットを送信キューに投入する。

packet_type* look_received_packet(void)
受信キューの先頭のパケットを参照する。

packet_type* look_received_packet(void)
受信キューの先頭のパケットを消去する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.18 dummy_network_interfaceクラス

確率モデルシミュレーションで使用するネットワークインタフェース。 network_interfaceクラスの派生クラスである。指定した宛先およびフリット 長のパケットの送信と、受信したパケットの自動破棄のみを行う。

bool is_ready(void) const
パケットを送信可能であれば真を返す。

void send_packet(node_address_type dst, size_t len)
パケットを送信する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.19 single_processing_elementクラス

単一のプロセッサと、そのメモリマップを統合した同期ユニットである。実行 するプログラムなどへの引数の受渡し機構もサポートする。

以下の関数は全て純粋仮想関数で、派生クラスで実体を定義する必要がある。

virtual const processor_type& processor(void) const
プロセッサを参照する。

virtual const memory_map_type& memory_map(void) const
メモリマップを参照する。

virtual bool is_halt(void) const
実行が停止していれば真を返す。

virtual bool is_bus_error(void) const
バスエラーが発生していれば真を返す。

virtual address_type bus_error_address(void) const
バスエラーのアドレスを返す。

virtual size_t processor_number(void) const
登録されているプロセッサ数を返す。

virtual size_t processor_id(void) const
登録されているプロセッサIDを返す。

virtual void set_processor_number(size_t)
プロセッサ数を登録する。

virtual void set_processor_id(size_t)
プロセッサIDを登録する。

virtual void set_file_table_size(size_t)
ファイルテーブルのサイズを設定する。

virtual void set_standard_input_stream(istream&)
標準入力ストリームを設定する。

virtual void set_standard_output_stream(ostream&)
標準出力ストリームを設定する。

virtual void set_standard_error_stream(ostream&)
標準エラー出力ストリームを設定する。

virtual void set_commandline_argument(const char* const*)
コマンドライン引数を設定する。

virtual int commandline_status(void) const
実行したプログラムの終了ステータスを受け取る。

virtual bool is_defined_sysinfo(const string&) const
引数で指定されたkeyを持つ情報がsysinfo連想配列内で定義されていれば真を 返す。

bool is_defined_integer_sysinfo(const string&) const
引数で指定されたkeyを持つ情報がsysinfo連想配列内で整数として定義されて いれば真を返す。

bool is_defined_string_sysinfo(const string&) const
引数で指定されたkeyを持つ情報がsysinfo連想配列内で文字列として定義され ていれば真を返す。

data_type get_integer_sysinfo(const string&) const
引数で指定されたkeyを持つsysinfo連想配列内の整数情報の値を返す。

const string& get_string_sysinfo(const string&) const
引数で指定されたkeyを持つsysinfo連想配列内の文字列情報の値を返す。

void set_sysinfo(const string&, data_type)
第一引数で指定されたkey、第二引数で指定された整数値をsysinfo連想配列に 登録する。

void set_sysinfo(const string&, const string&)
第一引数で指定されたkey、第二引数で指定された文字列値をsysinfo連想配列 に登録する。

void unset_sysinfo(const string&)
引数で指定されたkeyの情報をsysinfo連想配列から削除する。

data_type timer_clock_value(void) const
内部タイマの値を得る。

virtual bool load(const char*)
プログラムをロードする。ロードに成功した場合真を返す。

virtual void disassemble(ostream&, address_type, size_type) const
第二引数と第三引数で示される領域の逆アセンブルリストを、第一引数で示さ れるストリームに出力する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.20 generic_processing_elementクラス

プロセッサ、ローカルメモリ、sysinfo連想配列、バスエラー検出機構、入出 力デバイスを実体として内包する、並列計算機用のプロセシングエレメントク ラス。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Masaki WAKABAYASHI on September, 3 2003 using texi2html