skip ads

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

以下は下記原文 2003/12/26(JST)時点 の非公式翻訳です。   転記などはご遠慮ください。  
オリジナルの知的財産権は University of California に属します。  
原文: The BOINC application programming interface (API)
 
 
最終更新時刻 11:29 PM, Dec. 26 2003 JST

BOINCのAPI


Last modified 12:20 PM, October 13 2003

BOINCのAPIはC++言語で書かれた関数の集まりです。  とくに明記しないかぎり、これら関数は整数の復帰値でエラーコードを返します。  値 0 が成功を示します。 [0 でない場合、つまり] 失敗で復帰したときには、 [そのAPIを呼び出した]アプリケーションはその[復帰値を]ステイタスとして exitするべきです。  BOINCのグラフィクスAPIについては、 分けて 説明します。 

初期化と使用終了

[BOINCのAPIを使う]アプリケーションは、他のBOINCの関数を呼んだり、 入出力処理をする前に下記の関数をよばなければなりません。 
    int boinc_init(bool standalone=false);
引数 standalone を true で呼んだ場合は、 アプリケーションはBOINCコア・クライアントとは独立に機能します。  (この動作は、テストのときに役に立ちます(訳注1))。 

アプリケーションが終了するときには、

    int boinc_finish(int status);
を呼ばなければなりません。 もしエラーに遭遇していた場合は、 status は 0でない値にします。  この関数は復帰しません。 

ファイル名の解決

名前のついた入力ファイル・出力ファイルをアプリケーションが 使うときには、論理的なファイル名を物理的なファイル名に 変換するために、
    int boinc_resolve_filename(char *logical_name, char *physical_name, int len);
または、
    int boinc_resolve_filename(char *logical_name, 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() は、一時的なファイルには使う必要はありません。 

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

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

チェック・ポインティングの頻度は、利用者の好み(preference)で設定可能です。  (たとえば、ラップトップ型マシンだったら、まれにしかチェックポイントを とらないかもしれません)。 アプリケーションは、 チェックポイントをとることが可能なところにきたら、いつでも、

    bool boinc_time_to_checkpoint();
を呼ぶ必要があります。  この関数が true を返したら、アプリケーションは状態ファイルへの書き出しを 行い、全ての出力ファイルをフラッシュしてから、
    void boinc_checkpoint_completed();
を呼んでください。  boinc_time_to_checkpoint()は高速ですから、 頻繁に(毎秒100〜1000回)呼んでも問題ありません。 

アトミックな(訳注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() が呼ばれたときだけ、 ディスクへの書き込みをします。 これを使えば、出力ファイルと状態ファイルを ほとんどアトミックに書き出すことができます。 

コア・クライアントとの通信

コア・クライアントのGUIは、計算中のワークユニットの完了率(%)を表示します。  この表示を最新に保つため、アプリケーションは定期的に

   boinc_fraction_done(double fraction_done);
という関数を呼ぶ必要があります。 ここで、 fraction_done という引数が、おおまかに推定したワークユニットの完了率 (0〜1の間の値)です。  この関数は高速ですから、頻繁に呼んで問題ありません。 

下記の関数群によって、コア・クライアントから種々の情報を取り出すことができます。  グラフィクスの表示に便利ではないでしょうか。 

    int boinc_get_init_data(APP_INIT_DATA&);

    struct APP_INIT_DATA {
        char project_preferences[4096];
        char user_name[256];
        char team_name[256];
        double user_total_credit;
        double user_expavg_credit;
        double team_total_credit;
        double team_expavg_credit;
    };
この関数を使って取り出せる情報は、以下のとおりです:

project_preferences XML形式の文字列。  この参加者のプロジェクトごとの好みの設定(preference)を表現しています。 
user_name このプロジェクトにおける、この参加者の 「スクリーンネーム(訳注3)」。 
team_name この参加者の所属するチーム名(チームに入っている場合のみ)。 
user_total_credit この参加者がこのプロジェクトでこなした仕事の総計。 
user_expavg_credit この参加者が最近こなしている日ごとの仕事の平均量。 
team_total_credit [この参加者の属する]チームが、 このプロジェクトでこなした仕事の総量。 
team_expavg_credit [この参加者の属する]チームが、 最近こなしている日ごとの仕事の平均量。 

アプリケーションは、費やした総CPU時間を得るのに

    int boinc_wu_cpu_time(double &cpu_time);
という関数を使えます。 (得られるCPU時間は、処理中のワークユニットを 計算し始めたときからの累計です。 最近の再開時点からの時間ではありません)。  グラフィクスの描画にかかったCPU時間は、この値では除かれています。 

複数のプログラムからなるアプリケーション

アプリケーションの中には、複数のプログラムからなっていて、 1つの主プログラム(main program)が、1つ以上の数の 他の子プログラムの取りまとめ役(coordinator)として働く、という構成を とる場合があります。 この場合、個々のプログラムが、上記に 書いたとおりに、BOINC APIを使う必要があります。 

個々のプログラムは、それらごとに状態ファイルを持つべきであり、 取りまとめ役(coordinator)である主プログラムの状態ファイルは、 どの子プログラムが最後に動作していたかを記録します。 

完了率を正しく実装するためには、主プログラムは子プログラムに対して (おそらくコマンドライン引数として)、その子プログラムが 開始する時点と終了する時点の完了率の情報を示してやるべきでしょう。 

この取りまとめ役のプログラムは、子プロセスを作る(folkする)前に、

    void boinc_child_start();
を呼ばなければなりません。  子プロセスが終了したら、取りまとめ役のプログラムは、 次の子プロセスを作る前に、
    void boinc_child_done(double total_cpu);
という関数を呼んで、終了した子プロセスが使ったCPU時間を得る 必要があります。 

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

Copyright © 2003 University of California
Translated by JE2BWM.