並列グラフ探索問題用ライブラリpgraphのAPI

概要

本ライブラリは擬似的に有向グラフを作りその情報をユーザに返す。グラフは サイクルや合流を含んでいるかもしれない。

ライブラリはいくつかの種類(=kind)のグラフを作成できる。kindは1--4(予定) の整数である。各種類において、いくつかの異なる大きさ(=class)のグラフを 作成できる。classは1--3(予定)の整数である。

各ノードは定数長(=nodesize, グラフ種類に依存する)のバイト列である。バ イト列の意味はユーザに知らされないので、ブラックボックス的に用いること。 ただしユーザはmemcmpなどによってノードの等価性を調べることができるし、 バイト列の中身からハッシュ値を生成することも自由である。バイト列を memcpyなどでコピーしても良いし、(同アーキテクチャの)分散環境において他 プロセッサに送信することもできる。

たとえば、ノードの等価性は以下のように調べられる。

int i;
for (i = 0; i < nodesize; i++) { 
      if (a[i] != b[i]) return DIFFERNT; 
}
return SAME;

使い方

pgraph.hをインクルードする。 pgraph.aをユーザプログラムとリンクする。リンク例は以下の通りである。
  gcc [your-program].o pgraph.a -o [your-program] 
pgraph.h, pgraph.aの在処については pgraphトップページを参照のこと。

API

int pgraph_init(int kind, int cls)

ライブラリの初期化を行なう。他の関数を呼ぶ前にpgraph_init()を一度だけ 呼ぶこと。

kindはpgraphが作るグラフの種類を表す整数である。 classはグラフサイズを表す整数である。


size_t pgraph_node_size()

ノードを表すバイト列の長さnodesizeをbyte単位で返す。

int pgraph_get_root(char *p)

グラフの根ノードをpに格納する。pは充分なサイズ(nodesize以上)を持ってい る必要がある。

int pgraph_max_successors()

グラフの各ノードが持ちうる後続ノード数の最大値を返す。

int pgraph_num_successors(char *p)

ノードpが持つ後続ノードの数を返す。この値はpgraph_max_successors()が返 す値以下であることが保証される。

int pgraph_get_children(char *p, char *c)

ノードpが持つ全ての後続ノード達を、cに格納する。cは充分なサイズ (nodesize * 後続ノード数)を持っている必要がある。返り値は、ノードpが持 つ後続ノード数である。

int pgraph_report(int num_nodes)

計算結果をライブラリに報告する。num_nodesにはユーザが計測したノード数 を与えること。 pgraph_reportは結果の可否(予定)、経過時間を標準出力へ出力する。

参考1: 経過時間はpgraph_init呼出時からpgraph_report呼出時までの 実時間(gettimeofday利用)である。

参考2: 出力例は以下の通りである。

***********************************************************
PGRAPH $xxx: pgraph.c,v 1.4 2002/12/02 06:35:46 endo Exp $
Reported answer: 271559
Elapsed time: 14.750 sec
***********************************************************

int pgraph_compare_and_swap(int *p, int oldn, int newn)

アトミックに以下の操作(compare&swap)を行なう。アドレスpの内容がoldnに 等しいのであれば、pの内容をnewnに書き換えて1を返す。そうでなければ、p の内容を変更せずに0を返す。

参考1: 疑似コードで表すと、以下のような操作をアトミックに行なう。

if (*p == oldn) { *p = newn; return 1; } else return 0;

参考2: SPARCプロセッサではcas命令を実行する。Intelプロセッサでは lock/cmpxchg 命令を実行する。

注意: 成功判定方法が授業の説明と異なるので注意。


void pgraph_sync()

syncを行なう。pgraph_sync()の前のメモリアクセスと、後のメモリアクセスの 順序が入れ替わることはない。

参考: SPARCプロセッサでは membar #LoadLoad | #LoadStore | #StoreLoad | #StoreStore 命令を実行する。Intelプロセッサではcpuid命令を実行する。


$Id: api.html,v 1.6 2002/12/03 04:32:04 endo Exp $