boinc/html/user/gpu_list.php

151 lines
3.6 KiB
PHP

<?php
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 "<td><h2>$name</h2>\n";
if (!count($models)) {
echo tra("No GPU tasks reported")."</td>\n";
return;
}
uasort($models, 'gpucmp');
echo "<ol>\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 "<li>$model\n";
}
echo "</ol></td>\n";
}
function show_vendor($vendor, $x) {
echo "<h2>$vendor</h2>\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 "<tr>";
if ($show_total) {
show_list($x->total, "Total");
}
show_list($x->win, "Windows");
show_list($x->linux, "Linux");
show_list($x->mac, "Mac");
echo "</tr></table>\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");
?>