int runNBodySimulation(const NBodyFlags* nbf) { NBodyCtx* ctx = &_ctx; NBodyState* st = &_st; int rc = 0; real chisq; double ts = 0.0, te = 0.0; nbodySetCtxFromFlags(ctx, nbf); if (setupRun(ctx, st, &ctx->histogramParams, nbf)) { return warn1("Failed to setup run\n"); } if (initOutput(st, nbf)) { return warn1("Failed to open output files\n"); } if (createSharedScene(st, ctx, nbf->inputFile)) { return warn1("Failed to create shared scene\n"); } ts = mwGetTime(); rc = runSystem(ctx, st, nbf); if (rc) return warn1("Error running system\n"); te = mwGetTime(); if (nbf->printTiming) { printf("<run_time> %f </run_time>\n", te - ts); } /* Get the likelihood */ chisq = nbodyChisq(ctx, st, nbf, &ctx->histogramParams); if (isnan(chisq)) { warn("Failed to calculate chisq\n"); rc = 1; } finalOutput(ctx, st, nbf, chisq); destroyNBodyState(st); return rc; }
static void calculateIntegralsIntFp(const AstronomyParameters* ap, const IntegralArea* ias, const StreamConstantsIntFp* sc, const StreamGauss sg, EvaluationState* es, const CLRequest* clr, GPUInfo* ci, int useImages) { const IntegralArea* ia; double t1, t2; int rc; #if SEPARATION_CAL if (separationLoadKernel(ci, ap, sc) != CAL_RESULT_OK) fail("Failed to load integral kernel"); #endif /* SEPARATION_OPENCL */ for (; es->currentCut < es->numberCuts; es->currentCut++) { es->cut = &es->cuts[es->currentCut]; ia = &ias[es->currentCut]; es->current_calc_probs = completedIntegralProgress(ias, es); t1 = mwGetTime(); #if SEPARATION_OPENCL rc = integrateCL(ap, ia, sc, sg, es, clr, ci, (cl_bool) useImages); #elif SEPARATION_CAL rc = integrateCAL(ap, ia, sg, es, clr, ci); #else rc = integrateIntFp(ap, ia, sc, sg, es, clr); #endif /* SEPARATION_OPENCL */ t2 = mwGetTime(); warn("Integral %u time = %f s\n", es->currentCut, t2 - t1); if (rc || isnan(es->cut->bgIntegral)) fail("Failed to calculate integral %u\n", es->currentCut); cleanStreamIntegralsIntFp(es->cut->streamIntegrals, sc, ap->number_streams); clearEvaluationStateTmpSums(es); } #if SEPARATION_CAL mwUnloadKernel(ci); #endif /* SEPARATION_CAL */ }
/* Pretty much boinc_rename() mangled a bit to fit here temporarily */ static int mw_boinc_rename(const char* old, const char* newf) { int retval; const double fileRetryInterval = 5; retval = mw_boinc_rename_aux(old, newf); if (retval) { double start = mwGetTime(); do { mw_boinc_sleep(2.0 * (double) rand() / (double) RAND_MAX); retval = mw_boinc_rename_aux(old, newf); if (!retval) break; } while (mwGetTime() < start + fileRetryInterval); } return retval; }
double mwGetTimeMilli(void) { return 1.0e3 * mwGetTime(); }
int nbMain(const NBodyFlags* nbf) { NBodyCtx* ctx = &_ctx; NBodyState* st = &_st; CLRequest clr; NBodyStatus rc = NBODY_SUCCESS; real ts = 0.0, te = 0.0; if (!nbOutputIsUseful(nbf)) { return NBODY_USER_ERROR; } nbSetCLRequestFromFlags(&clr, nbf); /* Find out what device we're using so we can tell the workunit * about it */ if (NBODY_OPENCL && !nbf->noCL) { rc = nbInitCL(st, ctx, &clr); if (nbStatusIsFatal(rc)) { destroyNBodyState(st); return rc; } } rc = nbResumeOrNewRun(ctx, st, nbf); if (nbStatusIsFatal(rc)) { destroyNBodyState(st); return rc; } nbSetCtxFromFlags(ctx, nbf); /* Do this after setup to avoid the setup clobbering the flags */ nbSetStateFromFlags(st, nbf); if (NBODY_OPENCL && !nbf->noCL) { rc = nbInitNBodyStateCL(st, ctx); if (nbStatusIsFatal(rc)) { destroyNBodyState(st); return rc; } } if (nbCreateSharedScene(st, ctx)) { mw_printf("Failed to create shared scene\n"); } if (nbf->visualizer && st->scene) { /* Make sure the first scene is available for the launched graphics */ nbForceUpdateDisplayedBodies(ctx, st); /* Launch graphics and make sure we are sure the graphics is * attached in case we are using blocking mode */ nbLaunchVisualizer(st, nbf->graphicsBin, nbf->visArgs); } if (nbf->reportProgress) { nbSetupCursesOutput(); } ts = mwGetTime(); rc = nbRunSystem(ctx, st); te = mwGetTime(); if (nbf->reportProgress) { nbCleanupCursesOutput(); } nbReportSimulationComplete(st); if (nbStatusIsFatal(rc)) { mw_printf("Error running system: %s (%d)\n", showNBodyStatus(rc), rc); destroyNBodyState(st); return rc; } else { if (nbStatusIsWarning(rc)) { mw_printf("System complete with warnings: %s (%d)\n", showNBodyStatus(rc), rc); } if (nbf->printTiming) { printf("<run_time> %f </run_time>\n", te - ts); } } rc = nbReportResults(ctx, st, nbf); destroyNBodyState(st); return rc; }