https://github.com/BOINC/boinc/blob/master/html/inc/credit.inc
https://github.com/BOINC/boinc/blob/master/html/inc/host.inc
基本計算式
$now (計算完了時刻 サーバで受け取った時刻)$work_start_time (計算開始時刻 サーバから送信した時刻)
$work (取得したcredit)
&$avg (現在の平均RAC 参照渡し)
&$avg_time (最後に計算した$now 参照渡し)
M_LN2 = 0.693147180559945309417
CREDIT_HALF_LIFE = 86400*7
function update_average($now, $work_start_time, $work, &$avg, &$avg_time) {
if ($avg_time) {
$diff = $now - $avg_time;
if ($diff <0) $diff = 0;
$diff_days = $diff/86400;
$weight = exp(-$diff*M_LN2/CREDIT_HALF_LIFE);
$avg *= $weight;
if ((1.0-$weight)>0.000001) {
$avg += (1.0-$weight)*($work/$diff_days);
} else {
$avg += M_LN2*$work*86400/CREDIT_HALF_LIFE;
}
} else if ($work) {
$dd = ($now - $work_start_time)/86400;
$avg = $work/$dd;
}
$avg_time = $now;
}
- if ($avg_time)
- 初期値かどうかで分岐
- $diff = $now - $avg_time
- 仕事の完了時刻から一つ前の仕事の完了時刻を引き、解析に掛かった時間(秒)を求める。
- $diff_days = $diff/86400
- 秒から日へ変換。
- $weight = exp(-$diff*M_LN2/CREDIT_HALF_LIFE)
- 時間経過によるRAC減衰率を求める。
- M_LN2はln2。$diff = CREDIT_HALF_LIFEの時 $weight = 0.5 となる。
- if ((1.0-$weight)>0.000001)
- $diff (解析に掛かった秒数が1秒以上かで分岐)
- $avg += (1.0-$weight)*($work/$diff_days);
- ($work/$diff_days) で1日あたりの計算効率を求める。
- (1.0-$weight) 重みの平均?。 a*W + b*(1-W)
- $avg += M_LN2*$work*86400/CREDIT_HALF_LIFE
- $work*86400/CREDIT_HALF_LIFE 計算に7日掛かったとして1日あたりの計算効率を計算。
- M_LN2* 不明
- } else if ($work) {
- creditが0でない場合のみ実行
- $dd = ($now - $work_start_time)/86400
$avg = $work/$dd - 1日あたりの計算効率を求め、これを初期値とする。
- $avg_time = $now
- 計算完了時刻を更新
RACの計算
function host_update_credit($hostid) {
$total = 0;
$avg = 0;
$avg_time = 0;
$results = BoincResult::enum("hostid=$hostid order by received_time");
foreach($results as $result) {
if ($result->granted_credit <= 0) continue;
$total += $result->granted_credit;
update_average(
$result->received_time,
$result->sent_time,
$result->granted_credit,
$avg,
$avg_time
);
}
$now = time();
update_average(now, 0, 0, $avg, $avg_time);
$host = new BoincHost();
$host->id = hostid;
$host->update("total_credit=$total, expavg_credit=$avg, expavg_time=$now");
}
- $results = BoincResult::enum("hostid=$hostid order by received_time")
- データベースから指定したユーザのcreditデータを完了時刻でソートし、取得。
- foreach($results as $result)
- RACを計算。
RACを上げるには
- $diff (仕事の完了時刻と、一つ前の仕事の完了時刻の差)を小さくする。
- 実行待機や一時停止状態にならないようにする。
- 「最低限の備蓄」や「追加で下記の分まで備蓄」を0日にして仕事を溜めないようにする。
- 一つのプロジェクトに集中する。
0 件のコメント:
コメントを投稿