計算の功績 |
|
BOINC を使って作ったプロジェクトは、あなたのコンピューターがそのプロジェクトのために実行した計算について、 あなたに 功績(credit)を認める。 BOINCの功績単位、Cobblestone 注1、 は下記の両方の能力を持つ基準計算機で1日の1/100のCPU時間である。
いつかは、功績にネットワーク転送量とディスク量 も、計算量と同様に反映されるかもしれない。
申請する功績の量がプロジェクトに報告されるのは、 あなたの計算機がそのサーバと交信するときである。 あなたが受取る 認められた功績(granted credit) は、 申請した功績と違う値であることがあるし、認められるまで 数時間から数日の遅れがあるかもしれない。 というのは、 いくつかのプロジェクトは、結果が検証 された後でだけ、功績を認める からである。
プロジェクトは認められた功績について2つのカウントを維持する:
両方の功績(総功績・最近の平均功績)は、各参加者と計算機、チームのために維持される。 新しく功績が認められるごとに、下記の関数を使って、 計算機および参加者、チーム[それぞれ]の最近の平均功績を 計算しなおす。
void update_average(
double work_start_time, // 新しい仕事を開始した時刻
// (新しい仕事がなければ、ゼロ)
double work, // 新しい仕事の量
double half_life,
double& avg, // 一日あたりの平均の仕事量 (入力引数でありかつ、出力引数)
double& avg_time // 平均功績を最後に計算した時刻
) {
double now = dtime();
if (avg_time) {
// もし、平均値 R がすでに存在しているなら、この新しい仕事が 時刻
// avg_time から現在までのあいだずっと計算され続けていたと想定します。
// この期間から、計算速度 R' を算出します。
// R と R' との 加重平均 をとって、R の新しい値とします。
// 加重平均の取り方は、もし R' == 0 だったなら 正しい半減期を適用した
// 結果となるように率を決めます。
// ただし、このやりかただと、avg_time == now だった場合には、0*(1/0)
// を計算して値が爆発してしまいます。 そこで、時間差が 0 へ近づくときの
// 極限値を使います。 指数関数 exp のテイラー展開を一次まですれば、
// exp(x)=1+x+O(x^2) です。
// これを使い、重み付け weight の値を時間差 diff の最低次の項までで書けば、
// weight = 1 - diff ln(2) / half_life となります。
// これを使って計算方法を書き下していけば以下のように変形できます。
// avg += (1-weight)*(work/diff_days)
// avg += [diff*ln(2)/half_life] * (work*SECONDS_PER_DAY/diff)
// diff が約分されて消えることに気がつけば、以下となります。
// avg += [ln(2)/half_life] * work*SECONDS_PER_DAY
double diff, diff_days, weight;
diff = now - avg_time;
if (diff<0) diff=0;
diff_days = diff/SECONDS_PER_DAY;
weight = exp(-diff*M_LN2/half_life);
avg *= weight;
if ((1.0-weight) > 1.e-6) {
avg += (1-weight)*(work/diff_days);
} else {
avg += M_LN2*work*SECONDS_PER_DAY/half_life;
}
} else if (work) {
// 初回であれば、平均値は work/duration という値そのもの。
//
double dd = (now - work_start_time)/SECONDS_PER_DAY;
avg = work/dd;
}
avg_time = now;
}
最近の平均功績(RAC:Recent Avg. Credit) の値を BOINCが更新するのは、 新しく功績が認められたときだけです。 RAC を提供するインタフェースは、その最終更新時刻も同時に提供しています。 RAC の現在値を得るには、最後に更新された時点からの経過時間を元に、 その値を「減衰」させる必要があります。
function decay_average($avg, $avg_time, $now = 0) {
$M_LN2 = 0.693147180559945309417;
$credit_half_life = 86400 * 7;
if ($now == 0) {
$now = time();
}
$diff = $now - $avg_time;
$weight = exp(-$diff * $M_LN2/$credit_half_life);
$avg *= $weight;
return $avg;
}
この減衰処理をしないと、活発に計算をしていないものが、 不正に高い RAC を持つことになります。
この減衰処理のための関数は、 html/inc/credit.inc と html/inc/host.inc にあります。
最終更新時刻 00:47:44, 2006年08月12日(JST)
Copyright © 2010 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 © 2010 Yazawa Ikuo and 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.