2016/06/18

BOINC RACの計算式

参考 BOINCプロジェクトサーバのソースコード
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 件のコメント:

コメントを投稿