From c7a83e46e3dc4c00cac01c7a13e3cd779db5745a Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 5 May 2011 10:23:41 +0200 Subject: [PATCH] Try to improve xbt_parmap. Do not pre-compute the job share for each thread, and let the load balance automatically. --- src/xbt/parmap.c | 29 +++++++++++------------------ src/xbt/parmap_private.h | 1 + 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/xbt/parmap.c b/src/xbt/parmap.c index b48954960f..a472c2fe83 100644 --- a/src/xbt/parmap.c +++ b/src/xbt/parmap.c @@ -69,6 +69,7 @@ void xbt_parmap_destroy(xbt_parmap_t parmap) /* Assign resources to worker threads*/ parmap->fun = fun; parmap->data = data; + parmap->index = 0; #ifdef HAVE_FUTEX_H xbt_event_signal(parmap->sync_event); #endif @@ -77,7 +78,7 @@ void xbt_parmap_destroy(xbt_parmap_t parmap) static void *_xbt_parmap_worker_main(void *arg) { - unsigned int data_start, data_end, data_size, worker_id; + unsigned int worker_id; xbt_parmap_t parmap = (xbt_parmap_t)arg; /* Fetch a worker id */ @@ -92,27 +93,19 @@ static void *_xbt_parmap_worker_main(void *arg) xbt_event_wait(parmap->sync_event); #endif if(parmap->status == PARMAP_WORK){ - XBT_DEBUG("Worker %u got a job", worker_id); - - /* Compute how much data does every worker gets */ - data_size = (xbt_dynar_length(parmap->data) / parmap->num_workers) - + ((xbt_dynar_length(parmap->data) % parmap->num_workers) ? 1 : 0); - - /* Each worker data segment starts in a position associated with its id*/ - data_start = data_size * worker_id; + unsigned int i; + unsigned int n = 0; - /* The end of the worker data segment must be bounded by the end of the data vector */ - data_end = MIN(data_start + data_size, xbt_dynar_length(parmap->data)); - - XBT_DEBUG("Worker %u: data_start=%u data_end=%u (data_size=%u)", - worker_id, data_start, data_end, data_size); + XBT_DEBUG("Worker %u got a job", worker_id); - /* While the worker don't pass the end of it data segment apply the function */ - while(data_start < data_end){ - parmap->fun(*(void **)xbt_dynar_get_ptr(parmap->data, data_start)); - data_start++; + while ((i = __sync_fetch_and_add(&parmap->index, 1)) + < xbt_dynar_length(parmap->data)) { + parmap->fun(xbt_dynar_get_as(parmap->data, i, void*)); + n++; } + XBT_DEBUG("Worker %u processed %u tasks", worker_id, n); + /* We are destroying the parmap */ }else{ #ifdef HAVE_FUTEX_H diff --git a/src/xbt/parmap_private.h b/src/xbt/parmap_private.h index b6309be2ac..8b6c1bb677 100644 --- a/src/xbt/parmap_private.h +++ b/src/xbt/parmap_private.h @@ -42,6 +42,7 @@ typedef struct s_xbt_parmap { unsigned int workers_max_id; void_f_pvoid_t fun; xbt_dynar_t data; + unsigned int index; } s_xbt_parmap_t; #endif -- 2.20.1