Changes between Version 31 and Version 32 of AppMultiThread


Ignore:
Timestamp:
Oct 15, 2011, 9:42:31 PM (13 years ago)
Author:
davea
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AppMultiThread

    v31 v32  
    4848To deploy it:
    4949
    50  * Choose a "planning class" name for the program, say "par64" (see below).
    51  * Create an [UpdateVersions app version], specifying its plan class as "par64".
    52  * Link the following function into your scheduler (customized as needed):
     50 * Choose a "plan class" name for the program, say "mt" (see below).
     51 * Create an [AppVersionNew app version], specifying its plan class as "mt".
     52 * Edit the following in sched/sched_customize.cpp if needed:
    5353{{{
    54 bool app_plan(SCHEDULER_REQUEST& sreq, const char* plan_class, HOST_USAGE& hu) {
    55     if (!strcmp(plan_class, "par64")) {
    56         // the following is for an app that can use anywhere
    57         // from 1 to 64 threads, can control this exactly,
    58         // and whose speedup is .95N
    59         // (on a uniprocessor, we'll use a sequential app if one is available)
    60         //
    61         int ncpus, nthreads;
    62         bool bounded;
     54// the following is for an app that can use anywhere from 1 to 64 threads
     55//
     56static inline bool app_plan_mt(
     57    SCHEDULER_REQUEST& sreq, HOST_USAGE& hu
     58) {
     59    double ncpus = g_wreq->effective_ncpus;
     60        // number of usable CPUs, taking user prefs into account
     61    int nthreads = (int)ncpus;
     62    if (nthreads > 64) nthreads = 64;
     63    hu.avg_ncpus = nthreads;
     64    hu.max_ncpus = nthreads;
     65    sprintf(hu.cmdline, "--nthreads %d", nthreads);
     66    hu.projected_flops = sreq.host.p_fpops*hu.avg_ncpus*.99;
     67        // the .99 ensures that on uniprocessors a sequential app
     68        // will be used in preferences to this
     69    hu.peak_flops = sreq.host.p_fpops*hu.avg_ncpus;
     70    return true;
     71}
    6372
    64         get_ncpus(sreq, ncpus, bounded);
    65         nthreads = ncpus;
    66         if (nthreads > 64) nthreads = 64;
    67         hu.avg_ncpus = nthreads;
    68         hu.max_ncpus = nthreads;
    69         sprintf(hu.cmdline, "--nthreads %d", nthreads);
    70         hu.flops = 0.95*sreq.host.p_fpops*nthreads;
    71         if (config.debug_version_select) {
    72             log_messages.printf(MSG_NORMAL,
    73                 "[version] Multi-thread app estimate %.2f GFLOPS\n",
    74                 hu.flops/1e9
    75             );
    76         }
    77         return true;
    78     }
    79 ...
    80 }
    8173}}}
    82 
    83 The BOINC client will schedule applications based
    84 on the average CPU usage returned by this function.