BOINCのAPI (古い記事です。 Wiki に移行済) |
|
BOINCのAPIは C++言語で書かれた関数の集まりです。 これらのほとんどは、C言語インタフェースでできており、 Cやその他の計算機言語から使えるようにしてあります。 とくに明記しないかぎり、 これら関数は整数の復帰値でエラーコードを返します。 値 0 が成功を示します。
BOINC のアプリケーションはグラフィクスを生成しても良く、 スクリーンセイバーの機能を提供することができます。 これについては、グラフィクス API で説明します。
BOINC のアプリケーションは、順番に実行される一連の複数のプログラムで 構成することもできます。 このようなアプリケーションは、 複合アプリケーションと呼ばれます。 このための API を 複合アプリケーションのページで説明しています。
アプリケーションは、他のどのBOINC のAPI呼出しよりも前に、 診断機能の初期化 を呼び出さなければなりません。
グラフィクス用の初期化と、複合アプリケーション用の初期化については、 別途記述があります(上述のリンクをたどって下さい)。 その他のアプリケーションでは、他のBOINCの関数を呼んだり、 入出力処理をする前に下記の関数をよばなければなりません。
int boinc_init();
アプリケーションが終了するときには、
int boinc_finish(int status);を呼ばなければなりません。 もしエラーに遭遇していた場合は、
status は 0でない値にします。
この関数は復帰しません。
テストのために、BOINC のアプリケーションは 「スタンドアローン」モードで 動作させることもできますし、 BOINC クライアントのもとで走らせることもできます。 どちらの状態で動作しているかによって、そのアプリケーションの振る舞いを変えたいこともあるでしょう。 たとえば、スタンドアローン モードだったら、デバッグ情報を出力したいかもしれません。 スタンドアローン モードにいるのか、 BOINC クライアントの制御のもとで動作しているかを 調べるには、次の関数を呼んで下さい。
int boinc_is_standalone(void);この関数は、スタンドアローン モードのときには、ゼロでない値(True) を返し、 ゼロ(false)を返した場合は、 BOINC クライアントのもとで走っています。
int boinc_resolve_filename_s(char *logical_name, char *physical_name, int len);または、
int boinc_resolve_filename(char *logical_name, std::string& physical_name);
f = fopen("my_file", "r");
と書くかわりに、アプリケーションは、たとえば
string resolved_name;
retval = boinc_resolve_filename("my_file", resolved_name);
if (retval) fail("can't resolve filename");
f = fopen(resolved_name.c_str(), "r");
boinc_resolve_filename() は、一時的なファイルには使う必要はありません。
アプリケーションは、fopen() コールを以下で置き換える必要があります。
boinc_fopen(char* path, char* mode);この関数はプラットフォーム特有の問題を処理します。 Windowsでは、セキュリティプログラムとインデクシングプログラムが 短期間ですが、ファイルをロックすることがあるので、 boinc_fopen() 関数は、1秒間隔で何回か再試行します。 Unixでは、シグナルが fopen() 呼出しを EINTR で失敗に終わらせることがあるので、boinc_fopen 関数は、これを検出して少し再試行をします。 同時に、'close-on-exec' フラグをセットします。
チェック・ポインティングの頻度は、利用者の好み(preference)で設定可能です。 (たとえば、ラップトップ型マシンだったら、まれにしかチェックポイントをとらないかもしれません)。 アプリケーションは、チェックポイントをとることが可能なところにきたら、いつでも、
int boinc_time_to_checkpoint();を呼ぶ必要があります。 この関数が ゼロ以外(true) を返したら、即座にチェックポイント処理を行うべきです。 (つまり、アプリケーションは状態ファイルへの書き出しを行い、 全ての出力ファイルをフラッシュします)。 その後で、
void boinc_checkpoint_completed();を呼んでください。
boinc_time_to_checkpoint()は高速ですから、
頻繁に(毎秒100〜1000回)呼んでも問題ありません。
void boinc_begin_critical_section(); void boinc_end_critical_section();アプリケーションがコア・クライアントによって 一時中断されたり、kill されたりしたくない部分があるとき、 その部分のコードを上記の 2 つの呼出しで囲んでください。 ご注意: チェックポイントの採取の処理中は、 自動的に上記の扱いがなされます。
チェックポイントをアトミックに取るのが楽になるよう、
アプリケーションは出力ファイルと状態ファイルへの書き出し処理に、
MFILE クラスを使えるようにしてあります。
class MFILE {
public:
int open(char* path, char* mode);
int _putchar(char);
int puts(char*);
int printf(char* format, ...);
size_t write(const void* buf, size_t size, size_t nitems);
int close();
int flush();
};
MFILE はデータをメモリ上に溜め込んで、
flush() または close() が呼ばれたときだけ、
ディスクへの書き込みをします。 これを使えば、出力ファイルと状態ファイルを
ほとんどアトミックに書き出すことができます。
特別なことをしなければ、リザルトごとに申請する功績の大きさには、 計算に費やした合計の CPU 時間[経過時間]と、コア・クライアントがベンチマーク計算した値の 掛け算の結果が使われます。 コア・クライアントが知らないプロセッサ固有の最適化をアプリケーションが利用していたり、 異なるコンパイラ設定でアプリケーションがコンパイルされている、あるいは、 GPU など CPU 以外の資源を使って計算をした場合には、 上記の計算方法ではとても小さな値しかもたらさないことがあり得ます。 このような場合には、下記の関数が使えます。
void boinc_ops_per_cpu_second(double floating_point_ops, double integer_ops);この関数は、アプリケーション固有のベンチマーク結果の値を報告します。 その値は、1 CPU 秒あたりの浮動小数点演算および整数演算の回数です。
void boinc_ops_cumulative(double floating_point_ops, double integer_ops);この関数は、対象のリザルトの計算が始まってから実行された 浮動小数点演算および整数演算の累積回数を報告します。 この関数は、boinc_finish() を呼ぶ直前に呼び出さねばなりません。 それに加えて、計算の途中で呼び出すことは構いません。
コア・クライアントのGUIは、計算中のワークユニットの完了率(%)を表示します。 この表示を最新に保つため、アプリケーションは定期的に
boinc_fraction_done(double fraction_done);という関数を呼ぶ必要があります。 ここで、
fraction_done
という引数は、推定したワークユニットの完了率訳注1
(0〜1の間の値)です。 この関数は高速ですから、頻繁に呼んで問題ありません。
この関数を次に呼び出すときのこの引数の値は、減ることがあってはなりません。
異常が生じたときでも、アプリケーションは決してこの値を「リセット」して
初めからやり直してはならず、むしろエラーコードを指定して exit するべきです。
下記の関数は、最後に設定された値を返すか、あるいは何も設定されていなければ -1
を返します。
double boinc_get_fraction_done();(この関数は典型的にはグラフィクスのコードから呼ばれます)。
下記の関数群によって、コア・クライアントから種々の情報を取り出すことができます。 グラフィクスの表示に便利ではないでしょうか。
int boinc_get_init_data_p(APP_INIT_DATA*);
int boinc_get_init_data(APP_INIT_DATA&);
struct APP_INIT_DATA {
int major_version;
int minor_version;
int release;
int app_version;
char app_name[256];
char symstore[256];
char acct_mgr_url[256];
char* project_preferences;
int userid;
int teamid;
int hostid;
char user_name[256];
char team_name[256];
char project_dir[256];
char boinc_dir[256];
char wu_name[256];
char authenticator[256];
int slot;
double user_total_credit;
double user_expavg_credit;
double host_total_credit;
double host_expavg_credit;
double resource_share_fraction;
HOST_INFO host_info;
PROXY_INFO proxy_info; // in case app wants to use network
GLOBAL_PREFS global_prefs;
// info about the WU
double rsc_fpops_est;
double rsc_fpops_bound;
double rsc_memory_bound;
double rsc_disk_bound;
// the following are used for compound apps,
// where each stage of the computation is a fixed
// fraction of the total.
double fraction_done_start;
double fraction_done_end;
};
| core version | [このAPIを提供している] コア・クライアントの版番号 |
| app_name | [このAPIを呼んだその] アプリケーションの名前(サーバのデータベースに登録された名前) |
| project_preferences | XML形式の文字列。 この参加者のプロジェクトごとの好みの設定(preference)を表現しています。 |
| user_name | このプロジェクトにおける、この参加者の 「スクリーンネーム」訳注4。 |
| team_name | この参加者の所属するチーム名(チームに入っている場合のみ)。 |
| project_dir | プロジェクトディレクトリの絶対パス |
| boinc_dir | BOINC ルートディレクトリの絶対パス |
| wu_name | 計算中のワークユニットの名前 |
| authenticator | このプロジェクトに関する参加者の認証子訳注5 |
| slot | このアプリケーションの 'slot' (0, 1, ...) |
| user_total_credit | この参加者がこのプロジェクトでこなした仕事の総計。 |
| user_expavg_credit | この参加者が最近こなしている日ごとの仕事の平均量。 |
| team_total_credit | [この参加者の属する]チームが、 このプロジェクトでこなした仕事の総量。 |
| team_expavg_credit | [この参加者の属する]チームが、 最近こなしている日ごとの仕事の平均量。 |
| host_info | [実行中の]計算機のハードウェアとOSを記述する構造体 |
アプリケーションは、費やした総CPU時間を得るのに
int boinc_wu_cpu_time(double &cpu_time);
もし、ネットワーク接続が物理的に存在していないようであれば、 (例えば、gethostbyname() 呼出しが 正当な名前について失敗する場合) 下記を行ってください。
boinc_need_network() を呼びます。
この関数は参加者にネットワーク接続が必要だという注意を喚起します。
boinc_network_poll() を呼び出します。
boinc_network_done() を呼びます。
この関数は必要なら、モデム接続を終了させます。
void boinc_need_network(); int boinc_network_poll(); void boinc_network_done();
boinc_not_using_cpu()
と boinc_using_cpu() とではさんだ位置におくべきです。
最終更新時刻 16:12:06, 2007年05月19日(JST)
Copyright © 2008 University of California.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License,
Version 1.2 or any later version published by the Free Software Foundation.
Copyright © 2008 Komori Hitoshi(je2bwm at jarl.com).
Japanese translation from English web pages on BOINC.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License,
Version 1.2 or any later version published by the Free Software Foundation.