require_once("docutil.php");
page_head("Computation credit");
echo "
Each project gives you credit for the computations your
computers performs for the project.
BOINC's credit system is based on a 'reference computer' that can do
- 1 billion floating-point multiplies per second
- 1 billion integer multiplies per second
- 4 billion bytes per second of traffic to and from main memory
(sequential, half reads and half writes)
BOINC's unit of credit, the Cobblestone 1,
is 1/300 day of CPU time on the reference computer.
Some BOINC projects grant credit only after
results have been validated.
Each project maintains two types of credit:
- Total credit:
The total number of Cobblestones performed.
- Recent average credit:
The average number of Cobblestones per day performed recently.
This average decreases by a factor of two every week,
according to algorithms given below.
Both types of credit (total and recent average)
are maintained for each user and host.
Leader boards
BOINC lets projects export the credit-related
parts of their database as XML files.
These XML files can be used to generate
other breakdowns of users, hosts and teams,
or to generate leaderboards based on the sum of
credit from different projects.
Possible future improvements
-
Ideally, credit should reflect network transfer and disk storage as well
as computation.
But it's hard to verify these activities,
so for now they aren't included.
-
Eventually projects will develop applications that use
graphics coprocessors or other non-CPU hardware.
Credit should reflect the usage of such hardware.
To accomplish this, we will need to let
projects supply their own benchmarking functions.
This will also handle the situation where a project's
application does e.g. all integer arithmetic.
How 'Recent Average Credit' is computed
Each time new credit granted,
the following function is used to update the
recent average credit of the host, user and team:
",htmlspecialchars("
// Update an estimate of \"units per day\" of something (credit or CPU time).
// The estimate is exponentially averaged with a given half-life
// (i.e. if no new work is done, the average will decline by 50% in this time).
// This function can be called either with new work,
// or with zero work to decay an existing average.
//
void update_average(
double work_start_time, // when new work was started
// (or zero if no new work)
double work, // amount of new work
double half_life,
double& avg, // average work per day (in and out)
double& avg_time // when average was last computed
) {
double now = dtime();
if (avg_time) {
double diff = now - avg_time;
double diff_days = diff/SECONDS_PER_DAY;
double weight = exp(-diff*M_LN2/half_life);
avg *= weight;
avg += (1-weight)*(work/diff_days);
} else {
double dd = (now - work_start_time)/SECONDS_PER_DAY;
avg = work/dd;
}
avg_time = now;
}
"),"
1 Named after Jeff Cobb of SETI@home
";
page_tail();
?>