static void xbt_parmap_posix_master_signal(xbt_parmap_t parmap);
static void xbt_parmap_posix_worker_wait(xbt_parmap_t parmap, unsigned round);
static void xbt_parmap_posix_master_signal(xbt_parmap_t parmap);
static void xbt_parmap_posix_worker_wait(xbt_parmap_t parmap, unsigned round);
static void xbt_parmap_futex_master_wait(xbt_parmap_t parmap);
static void xbt_parmap_futex_worker_signal(xbt_parmap_t parmap);
static void xbt_parmap_futex_master_signal(xbt_parmap_t parmap);
static void xbt_parmap_futex_master_wait(xbt_parmap_t parmap);
static void xbt_parmap_futex_worker_signal(xbt_parmap_t parmap);
static void xbt_parmap_futex_master_signal(xbt_parmap_t parmap);
static void xbt_parmap_busy_master_wait(xbt_parmap_t parmap);
static void xbt_parmap_busy_worker_signal(xbt_parmap_t parmap);
static void xbt_parmap_busy_master_signal(xbt_parmap_t parmap);
static void xbt_parmap_busy_worker_wait(xbt_parmap_t parmap, unsigned round);
static void xbt_parmap_busy_master_wait(xbt_parmap_t parmap);
static void xbt_parmap_busy_worker_signal(xbt_parmap_t parmap);
static void xbt_parmap_busy_master_signal(xbt_parmap_t parmap);
static void xbt_parmap_busy_worker_wait(xbt_parmap_t parmap, unsigned round);
static void xbt_parmap_mc_work(xbt_parmap_t parmap, int worker_id);
static void *xbt_parmap_mc_worker_main(void *arg);
#endif
static void xbt_parmap_mc_work(xbt_parmap_t parmap, int worker_id);
static void *xbt_parmap_mc_worker_main(void *arg);
#endif
xbt_dynar_t data; /**< parameters to pass to fun in parallel */
std::atomic<unsigned int> index; /**< index of the next element of data to pick */
xbt_dynar_t data; /**< parameters to pass to fun in parallel */
std::atomic<unsigned int> index; /**< index of the next element of data to pick */
XBT_DEBUG("Create new parmap (%u workers)", num_workers);
/* Initialize the thread pool data structure */
XBT_DEBUG("Create new parmap (%u workers)", num_workers);
/* Initialize the thread pool data structure */
/* Create the pool of worker threads */
xbt_parmap_thread_data_t data;
parmap->workers[0] = NULL;
/* Create the pool of worker threads */
xbt_parmap_thread_data_t data;
parmap->workers[0] = NULL;
- parmap->workers[i] = xbt_os_thread_create(NULL, xbt_parmap_worker_main,
- data, NULL);
-#ifdef CORE_BINDING
+ parmap->workers[i] = xbt_os_thread_create(NULL, xbt_parmap_worker_main, data, NULL);
+#if HAVE_PTHREAD_SETAFFINITY
- 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);
static void xbt_parmap_set_mode(xbt_parmap_t parmap, e_xbt_parmap_mode_t mode)
{
if (mode == XBT_PARMAP_DEFAULT) {
static void xbt_parmap_set_mode(xbt_parmap_t parmap, e_xbt_parmap_mode_t mode)
{
if (mode == XBT_PARMAP_DEFAULT) {
case XBT_PARMAP_POSIX:
parmap->master_wait_f = xbt_parmap_posix_master_wait;
parmap->worker_signal_f = xbt_parmap_posix_worker_signal;
case XBT_PARMAP_POSIX:
parmap->master_wait_f = xbt_parmap_posix_master_wait;
parmap->worker_signal_f = xbt_parmap_posix_worker_signal;
parmap->master_wait_f = xbt_parmap_futex_master_wait;
parmap->worker_signal_f = xbt_parmap_futex_worker_signal;
parmap->master_signal_f = xbt_parmap_futex_master_signal;
parmap->master_wait_f = xbt_parmap_futex_master_wait;
parmap->worker_signal_f = xbt_parmap_futex_worker_signal;
parmap->master_signal_f = xbt_parmap_futex_master_signal;
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;
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;
while (1) {
parmap->worker_wait_f(parmap, ++round);
if (parmap->status == XBT_PARMAP_WORK) {
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);
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);
/**
* \brief Applies a list of tasks in parallel.
* \param parmap a parallel map object
* \param fun the function to call in parallel
* \param data each element of this dynar will be passed as an argument to fun
*/
/**
* \brief Applies a list of tasks in parallel.
* \param parmap a parallel map object
* \param fun the function to call in parallel
* \param data each element of this dynar will be passed as an argument to fun
*/
-int xbt_parmap_mc_apply(xbt_parmap_t parmap, int_f_pvoid_pvoid_t fun,
- void* data, unsigned int length, void* ref_snapshot)
+int xbt_parmap_mc_apply(xbt_parmap_t parmap, int_f_pvoid_pvoid_t fun, void* data, unsigned int length,
+ void* ref_snapshot)
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*));
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) {
//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){
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;
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) {
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);
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);
static void futex_wait(unsigned *uaddr, unsigned val)
{
XBT_VERB("Waiting on futex %p", uaddr);
static void futex_wait(unsigned *uaddr, unsigned val)
{
XBT_VERB("Waiting on futex %p", uaddr);