core_bind++;
else
core_bind = 0;
-#endif
+#endif
}
return parmap;
}
data = xbt_new0(s_xbt_parmap_thread_data_t, 1);
data->parmap = parmap;
data->worker_id = i;
- parmap->workers[i] = xbt_os_thread_create(NULL, xbt_parmap_mc_worker_main,
- data, NULL);
+ parmap->workers[i] = xbt_os_thread_create(NULL, xbt_parmap_mc_worker_main, data, NULL);
}
return parmap;
}
parmap->mode = mode;
switch (mode) {
-
case XBT_PARMAP_POSIX:
parmap->master_wait_f = xbt_parmap_posix_master_wait;
parmap->worker_signal_f = xbt_parmap_posix_worker_signal;
parmap->done_cond = xbt_os_cond_init();
parmap->done_mutex = xbt_os_mutex_init();
break;
-
-
case XBT_PARMAP_FUTEX:
#if HAVE_FUTEX_H
parmap->master_wait_f = xbt_parmap_futex_master_wait;
#else
xbt_die("Futex is not available on this OS.");
#endif
-
case XBT_PARMAP_BUSY_WAIT:
-#ifndef _MSC_VER
parmap->master_wait_f = xbt_parmap_busy_master_wait;
parmap->worker_signal_f = xbt_parmap_busy_worker_signal;
parmap->master_signal_f = xbt_parmap_busy_master_signal;
xbt_os_cond_destroy(parmap->done_cond);
xbt_os_mutex_destroy(parmap->done_mutex);
break;
-#else
- xbt_die("Busy waiting not implemented on Windows yet.");
-#endif
-
case XBT_PARMAP_DEFAULT:
THROW_IMPOSSIBLE;
break;
static void xbt_parmap_work(xbt_parmap_t parmap)
{
unsigned index;
- while ((index = parmap->index++)
- < xbt_dynar_length(parmap->data))
+ while ((index = parmap->index++) < xbt_dynar_length(parmap->data))
parmap->fun(xbt_dynar_get_as(parmap->data, index, void*));
}
while (1) {
parmap->worker_wait_f(parmap, ++round);
if (parmap->status == XBT_PARMAP_WORK) {
-
XBT_DEBUG("Worker %d got a job", data->worker_id);
xbt_parmap_work(parmap);
parmap->worker_signal_f(parmap);
XBT_DEBUG("Worker %d has finished", data->worker_id);
-
/* We are destroying the parmap */
} else {
SIMIX_context_free(context);
}
#if HAVE_MC
-
/**
* \brief Applies a list of tasks in parallel.
* \param parmap a parallel map object
static void xbt_parmap_mc_work(xbt_parmap_t parmap, int worker_id)
{
- unsigned int data_size = (parmap->length / parmap->num_workers) +
- ((parmap->length % parmap->num_workers) ? 1 :0);
+ unsigned int data_size = (parmap->length / parmap->num_workers) + ((parmap->length % parmap->num_workers) ? 1 :0);
void* start = (char*)parmap->mc_data + (data_size*worker_id*sizeof(void*));
void* end = MIN((char *)start + data_size* sizeof(void*), (char*)parmap->mc_data + parmap->length*sizeof(void*));
-
+
//XBT_CRITICAL("Worker %d : %p -> %p (%d)", worker_id, start, end, data_size);
while ( start < end && parmap->finish == -1) {
int res = parmap->snapshot_compare(*(void**)start, parmap->ref_snapshot);
start = (char *)start + sizeof(start);
if (!res){
-
parmap->finish = ((char*)start - (char*)parmap->mc_data) / sizeof(void*);
//XBT_CRITICAL("Find good one %p (%p)", start, parmap->mc_data);
break;
while (1) {
parmap->worker_wait_f(parmap, ++round);
if (parmap->status == XBT_PARMAP_WORK) {
-
XBT_DEBUG("Worker %d got a job", data->worker_id);
xbt_parmap_mc_work(parmap, data->worker_id);
parmap->worker_signal_f(parmap);
XBT_DEBUG("Worker %d has finished", data->worker_id);
-
/* We are destroying the parmap */
} else {
xbt_free(data);
}
#endif
-#ifndef _MSC_VER
/**
* \brief Starts the parmap: waits for all workers to be ready and returns.
*
xbt_os_thread_yield();
}
}
-#endif /* ! _MSC_VER */