static void bench_parmap_full(int nthreads, e_xbt_parmap_mode_t mode) { unsigned *a; xbt_dynar_t data; xbt_parmap_t parmap; int i; double start_time, elapsed_time; printf("** mode = %-15s ", parmap_mode_name(mode)); fflush(stdout); if (parmap_skip_mode(mode)) return; array_new(&a, &data); i = 0; start_time = xbt_os_time(); do { parmap = xbt_parmap_new(nthreads, mode); xbt_parmap_apply(parmap, fun_to_apply, data); xbt_parmap_destroy(parmap); elapsed_time = xbt_os_time() - start_time; i++; } while (elapsed_time < TIMEOUT); printf("ran %d times in %g seconds (%g/s)\n", i, elapsed_time, i / elapsed_time); xbt_dynar_free(&data); xbt_free(a); }
void RawContextFactory::run_all_parallel() { #if HAVE_THREAD_CONTEXTS raw_threads_working = 0; if (raw_parmap == nullptr) raw_parmap = xbt_parmap_new( SIMIX_context_get_nthreads(), SIMIX_context_get_parallel_mode()); xbt_parmap_apply(raw_parmap, [](void* arg) { smx_process_t process = static_cast<smx_process_t>(arg); RawContext* context = static_cast<RawContext*>(process->context); context->resume_parallel(); }, simix_global->process_to_run); #else xbt_die("You asked for a parallel execution, but you don't have any threads."); #endif }
static int test_parmap_basic(e_xbt_parmap_mode_t mode) { int ret = 0; unsigned num_workers; for (num_workers = 1 ; num_workers <= 16 ; num_workers *= 2) { const unsigned len = 1033; const unsigned num = 5; unsigned *a; xbt_dynar_t data; xbt_parmap_t parmap; unsigned i; parmap = xbt_parmap_new(num_workers, mode); a = xbt_malloc(len * sizeof *a); data = xbt_dynar_new(sizeof a, NULL); for (i = 0; i < len; i++) { a[i] = i; xbt_dynar_push_as(data, void *, &a[i]); } for (i = 0; i < num; i++) xbt_parmap_apply(parmap, fun_double, data); for (i = 0; i < len; i++) { unsigned expected = (1U << num) * (i + 1) - 1; if (a[i] != expected) { XBT_CRITICAL("with %u threads, a[%u]: expected %u, got %u", num_workers, i, expected, a[i]); ret = 1; break; } } xbt_dynar_free(&data); xbt_free(a); xbt_parmap_destroy(parmap); } return ret; }
void BoostContextFactory::run_all() { #ifdef HAVE_THREAD_CONTEXTS if (BoostContext::parallel_) { BoostContext::threads_working_ = 0; xbt_parmap_apply(BoostContext::parmap_, [](void* arg) { smx_process_t process = static_cast<smx_process_t>(arg); BoostContext* context = static_cast<BoostContext*>(process->context); return context->resume(); }, simix_global->process_to_run); } else #endif { smx_process_t first_process = xbt_dynar_get_as(simix_global->process_to_run, 0, smx_process_t); BoostContext::process_index_ = 1; /* execute the first process */ static_cast<BoostContext*>(first_process->context)->resume(); } }
static int test_parmap_extended(e_xbt_parmap_mode_t mode) { int ret = 0; unsigned num_workers; for (num_workers = 1 ; num_workers <= 16 ; num_workers *= 2) { const unsigned len = 2 * num_workers; uintptr_t *a; xbt_parmap_t parmap; xbt_dynar_t data; unsigned i; unsigned count; parmap = xbt_parmap_new(num_workers, mode); a = xbt_malloc(len * sizeof *a); data = xbt_dynar_new(sizeof a, NULL); for (i = 0; i < len; i++) xbt_dynar_push_as(data, void *, &a[i]); xbt_parmap_apply(parmap, fun_get_id, data); qsort(a, len, sizeof a[0], fun_compare); count = 1; for (i = 1; i < len; i++) if (a[i] != a[i - 1]) count++; if (count != num_workers) { XBT_CRITICAL("only %u/%u threads did some work", count, num_workers); ret = 1; } xbt_dynar_free(&data); xbt_free(a); xbt_parmap_destroy(parmap); } return ret; }
static void smx_ctx_boost_runall_parallel(void) { boost_threads_working = 0; xbt_parmap_apply(boost_parmap, (void_f_pvoid_t) smx_ctx_boost_resume_parallel, simix_global->process_to_run); }