diff --git a/checkin_notes b/checkin_notes index 465ee89584..e02d845fcf 100644 --- a/checkin_notes +++ b/checkin_notes @@ -9220,3 +9220,9 @@ David 13 Nov 2009 client/ app.cpp log_flags.cpp + +David 15 Nov 2009 + - credit tweaks + + sched/ + credit_test.cpp diff --git a/sched/credit_test.cpp b/sched/credit_test.cpp index af9dc2bba9..109d51d938 100644 --- a/sched/credit_test.cpp +++ b/sched/credit_test.cpp @@ -12,7 +12,7 @@ #include "sched_config.h" #include "boinc_db.h" -#define NJOBS 50000 +#define NJOBS 100000 // scan this many jobs #define MAX_CLAIMED_CREDIT 1e3 // Ignore jobs whose claimed (old) credit is greater than this. @@ -24,10 +24,11 @@ // FLOPS to cobblestones #define PRINT_AV_PERIOD 100 #define SCALE_AV_PERIOD 20 -#define MIN_HOST_SCALE_SAMPLES 5 +#define MIN_HOST_SCALE_SAMPLES 10 // don't use host scaling unless have this many samples for host #define MIN_SCALE_SAMPLES 100 - // don't update a version's scale unless it has this many samples + // don't update a version's scale unless it has this many samples, + // and don't accumulate stats until this occurs #define RSC_TYPE_CPU -1 #define RSC_TYPE_CUDA -2 @@ -118,12 +119,16 @@ APP_VERSION* lookup_av(int id) { exit(1); } - +// find CPU app version matching host's OS +// Note: app_versions is sorted by decreasing ID +// so we'll automatically find the newest one +// APP_VERSION* lookup_av_old(int appid, HOST& host) { unsigned int i; for (i=0; i= 3 && !strcmp(argv[1], "--app")) { appid = atoi(argv[2]); @@ -285,9 +293,8 @@ int main(int argc, char** argv) { } sprintf(clause, - "where server_state=%d and outcome=%d and validate_state=%d and claimed_credit<%f and claimed_credit>%f %s order by id desc limit %d", + "where server_state=%d and outcome=%d and claimed_credit<%f and claimed_credit>%f %s order by id desc limit %d", RESULT_SERVER_STATE_OVER, RESULT_OUTCOME_SUCCESS, - VALIDATE_STATE_VALID, MAX_CLAIMED_CREDIT, MIN_CLAIMED_CREDIT, subclause, NJOBS ); @@ -297,7 +304,7 @@ int main(int argc, char** argv) { double total_new_credit = 0; printf("DB query: select * from result %s\n", clause); while (!r.enumerate(clause)) { - printf("%d) result %d host %d\n", n, r.id, r.hostid); + printf("%d) result %d WU %d host %d\n", n, r.id, r.workunitid, r.hostid); // Compute or estimate peak FLOP count (PFC). // This is done as follows: @@ -319,26 +326,36 @@ int main(int argc, char** argv) { if (r.elapsed_time && r.flops_estimate && r.app_version_id) { // new client if (r.app_version_id < 0) { + // user is using anon platform app. + // Don't trust the FLOPS estimate. + // If it's a CPU app, use benchmarks*time. + // Otherwise use mean PFC for (resource type, app) + // rsc_type = get_rsc_type(r); printf(" anonymous platform, rsc type %s\n", rsc_type_name(rsc_type) ); - avp = lookup_av_anon(r.appid, rsc_type); - if (!avp) { - printf(" no version for resource type %s; skipping\n", - rsc_type_name(rsc_type) - ); - continue; + if (rsc_type == RSC_TYPE_CPU) { + lookup_host(host, r.hostid); + pfc = host.p_fpops * r.elapsed_time; + } else { + avp = lookup_av_anon(r.appid, rsc_type); + if (!avp) { + printf(" no version for resource type %s; skipping\n", + rsc_type_name(rsc_type) + ); + continue; + } + if (avp->pfc.n < 10) { + printf( + " app version %d has too few samples %f; skipping\n", + avp->id, avp->pfc.n + ); + continue; + } + pfc = avp->pfc.get_mean(); + printf(" using mean PFC: %.0fG\n", pfc/1e9); } - if (avp->pfc.n < 10) { - printf( - " app version %d has too few samples %f; skipping\n", - avp->id, avp->pfc.n - ); - continue; - } - pfc = avp->pfc.get_mean(); - printf(" using mean PFC: %.0fG\n", pfc/1e9); printf(" PFC: %.0fG raw credit: %.2f\n", pfc/1e9, pfc*COBBLESTONE_SCALE ); @@ -409,10 +426,12 @@ int main(int argc, char** argv) { new_claimed_credit, r.claimed_credit ); + if (accumulate_stats) { total_old_credit += r.claimed_credit; total_new_credit += new_claimed_credit; nstats++; + fprintf(f, "%d %d %.2f %.2f\n", r.workunitid, r.id, new_claimed_credit, r.claimed_credit); } n++; @@ -423,7 +442,11 @@ int main(int argc, char** argv) { if (n%PRINT_AV_PERIOD ==0) { print_avs(); } + if (n%1000 == 0) { + fprintf(stderr, "%d\n", n); + } } + fclose(f); if (nstats == 0) { printf("Insufficient jobs were read from DB\n"); exit(0);