以下は JE2BWM ほかが作成した翻訳 です。 原文は University of California より GFDL で配付されており、 この翻訳も GFDL に従います。
原文: The BOINC application programming interface (API) [ Deprectated - Wiki ]   (翻訳対象の更新日付は 7:54 PM UTC, April 20 2007 です)。

BOINCのAPI (古い記事です。 Wiki に移行済)

boinc.gif
(英語のみ)

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 クライアントのもとで走らせることもできます。 どちらの状態で動作しているかによって、そのアプリケーションの振る舞いを変えたいこともあるでしょう。 たとえば、スタンドアローン モードだったら、デバッグ情報を出力したいかもしれません。 スタンドアローン モードにいるのか、 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() は、一時的なファイルには使う必要はありません。

I/O ラッパー

アプリケーションは、fopen() コールを以下で置き換える必要があります。

boinc_fopen(char* path, char* mode);
この関数はプラットフォーム特有の問題を処理します。 Windowsでは、セキュリティプログラムとインデクシングプログラムが 短期間ですが、ファイルをロックすることがあるので、 boinc_fopen() 関数は、1秒間隔で何回か再試行します。 Unixでは、シグナルが fopen() 呼出しを EINTR で失敗に終わらせることがあるので、boinc_fopen 関数は、これを検出して少し再試行をします。 同時に、'close-on-exec' フラグをセットします。

チェック・ポインティング

ワークユニット1つを計算するのに長い時間がかかる場合、 その時点ごとの計算の状態をディスクに定期的に書き出したいでしょう。 この技法は、チェック・ポインティングと呼ばれています。 この状態を書き出したファイル(以後、状態ファイルと呼びます)には、 チェックポイントを取った時点と同じ状態から計算を再開するために必要な、 すべての情報を含んでいなければなりません。 アプリケーションは開始時に状態ファイルを読み、 どこから計算を始めるかをきめます。 もしBOINCクライアントが中断したり[異常]終了しても、 もっとも近いチェックポイントからその計算を再開できます。

チェック・ポインティングの頻度は、利用者の好み(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 つの呼出しで囲んでください。  ご注意: チェックポイントの採取の処理中は、 自動的に上記の扱いがなされます。

アトミックな訳注3ファイル更新

チェックポイントをアトミックに取るのが楽になるよう、 アプリケーションは出力ファイルと状態ファイルへの書き出し処理に、 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() が呼ばれたときだけ、 ディスクへの書き込みをします。 これを使えば、出力ファイルと状態ファイルを ほとんどアトミックに書き出すことができます。

功績(credit)を報告する

特別なことをしなければ、リザルトごとに申請する功績の大きさには、 計算に費やした合計の 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);
という関数を使えます。 (得られるCPU時間は、処理中のワークユニットを 計算し始めたときからの累計です。 最近の再開時点からの時間ではありません)。 グラフィクスの描画にかかったCPU時間は、この値では除かれています。

ネットワーク接続の要求

もし、ネットワーク接続が物理的に存在していないようであれば、 (例えば、gethostbyname() 呼出しが 正当な名前について失敗する場合) 下記を行ってください。

void boinc_need_network();
int boinc_network_poll();
void boinc_network_done();
ご注意: このやり方は、boinc_not_using_cpu() と boinc_using_cpu() とではさんだ位置におくべきです。
(訳注1) fraction_done:
大まかに見積もった計算完了率。 APIを参照してください。
(訳注2) (削除)
(訳注3) アトミック(atomic):
ある処理が実行されるかされないかどちらかで、中途半端になることがないとき、 それをアトミック(原子的)という言い方をします。 この場合は、書き出し処理が 全部正常に終わるか、まったく書き出しがおこらないかどちらかで、途中まで書いたが あとは書けなかったということはないぞ、ということが理想のatomicです。 しかし、このクラス MFILE の説明からすると完全にatomicではなく、実用的にはこれで充分、という実装のようです。
(訳注4) スクリーンネーム(screen name):
プロジェクトごとに参加者が名乗ることのできるニックネームのようなもの。
(訳注5) 認証子(authenticator):
アカウント・キーのこと。

BOINCの訳のメインページに戻る | (原文のメインページに戻る)
 

最終更新時刻 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.