. // generate a page of the best-performing GPU models. // // "best-performing" is defined as minimizing the average of // // elapsed_time(J)/rsc_fpops_est(J) // over completed jobs J currently in the DB require_once("../inc/util.inc"); function get_gpu_model($x, $vendor) { $descs = explode("]", $x); array_pop($descs); foreach ($descs as $desc) { $desc = trim($desc, "["); $d = explode("|", $desc); if ($d[0] == "BOINC") continue; if ($d[0] != $vendor) continue; return $d[1]; } return null; } function add_model($model, $r, &$models) { if (array_key_exists($model, $models)) { $models[$model]->count++; $models[$model]->time += $r->elapsed_time; } else { $x = null; $x->count = 1; $x->time = $r->elapsed_time; $models[$model] = $x; } } // return a data structure containing GPU usage info for a vendor // $x->total: combined list // $x->windows // $x->linux // $x->mac // function get_gpu_list($vendor) { $avs = BoincAppVersion::enum("plan_class like '%$vendor%'"); $av_ids = ""; foreach($avs as $av) { $av_ids .= "$av->id, "; } $av_ids .= "0"; $t = time() - 30*86400; $results = BoincResult::enum("app_version_id in ($av_ids) and create_time > $t and elapsed_time>100 limit 5000"); $total = array(); $win = array(); $linux = array(); $mac = array(); foreach ($results as $r) { $h = BoincHost::lookup_id($r->hostid); if (!$h) continue; $v = $vendor=="cuda"?"CUDA":"ATI"; $model = get_gpu_model($h->serialnum, $v); if (!$model) continue; add_model($model, $r, $total); if (strstr($h->os_name, "Windows")) { add_model($model, $r, $win); } if (strstr($h->os_name, "Linux")) { add_model($model, $r, $linux); } if (strstr($h->os_name, "Darwin")) { add_model($model, $r, $mac); } } $x = null; $x->total = $total; $x->win = $win; $x->linux = $linux; $x->mac = $mac; return $x; } function get_gpu_lists() { $x = null; $x->cuda = get_gpu_list("cuda"); $x->ati = get_gpu_list("ati"); return $x; } function gpucmp($x1, $x2) { $y1 = $x1->time/$x1->count; $y2 = $x2->time/$x2->count; return $y1 > $y2; } function show_list($models, $name) { echo "

$name

\n"; if (!count($models)) { echo tra("No GPU tasks reported")."\n"; return; } uasort($models, 'gpucmp'); echo "
    \n"; $max_count = 0; foreach ($models as $model=>$x) { if ($x->count > $max_count) $max_count = $x->count; } foreach ($models as $model=>$x) { if ($x->count < $max_count/10) continue; echo "
  1. $model\n"; } echo "
\n"; } function show_vendor($vendor, $x) { echo "

$vendor

\n"; if (!count($x->total)) { echo tra("No GPU tasks reported"); return; } $have_win = count($x->win)>0; $have_mac = count($x->mac)>0; $have_linux = count($x->linux)>0; $n = 0; if ($have_win) $n++; if ($have_mac) $n++; if ($have_linux) $n++; $show_total = $n>1; start_table(); echo ""; if ($show_total) { show_list($x->total, "Total"); } show_list($x->win, "Windows"); show_list($x->linux, "Linux"); show_list($x->mac, "Mac"); echo "\n"; } $d = get_cached_data(86400); if ($d) { $data = unserialize($d); } else { $data = get_gpu_lists(); set_cached_data(86400, serialize($data)); } page_head(tra("Top GPU models")); echo tra("The following lists show the most productive GPU models on different platforms."); show_vendor("NVIDIA", $data->cuda); show_vendor("ATI/AMD", $data->ati); page_tail(); $x = get_gpu_list("cuda"); ?>