| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /* StarPU --- Runtime system for heterogeneous multicore architectures.
- *
- * Copyright (C) 2012-2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
- *
- * StarPU is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or (at
- * your option) any later version.
- *
- * StarPU is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * See the GNU Lesser General Public License in COPYING.LGPL for more details.
- */
- #include <starpu.h>
- #include <core/simgrid.h>
- #include <common/config.h>
- #ifdef STARPU_SIMGRID
- #if SIMGRID_VERSION >= 32190
- #include <simgrid/simix.hpp>
- #else
- #include <simgrid/simix.h>
- #endif
- #include <smpi/smpi.h>
- /* thread_create function which implements inheritence of MPI privatization */
- /* See https://github.com/simgrid/simgrid/issues/139 */
- typedef struct
- {
- void_f_pvoid_t code;
- void *userparam;
- #if SIMGRID_VERSION < 32501
- void *father_data;
- #endif
- } thread_data_t;
- #if SIMGRID_VERSION >= 32501
- static void *_starpu_simgrid_xbt_thread_create_wrapper(void *arg)
- {
- thread_data_t *t = (thread_data_t *) arg;
- /* FIXME: Ugly work-around for bug in simgrid: the MPI context is not properly set at MSG process startup */
- starpu_sleep(0.000001);
- #ifdef HAVE_SMPI_THREAD_CREATE
- /* Make this actor inherit SMPI data from father actor */
- SMPI_thread_create();
- #endif
- t->code(t->userparam);
- free(t);
- return NULL;
- }
- #else
- #if SIMGRID_VERSION >= 32190
- static void _starpu_simgrid_xbt_thread_create_wrapper(void)
- #else
- static int _starpu_simgrid_xbt_thread_create_wrapper(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED)
- #endif
- {
- /* FIXME: Ugly work-around for bug in simgrid: the MPI context is not properly set at MSG process startup */
- starpu_sleep(0.000001);
- #ifdef HAVE_SMX_ACTOR_T
- smx_actor_t
- #else
- smx_process_t
- #endif
- self = SIMIX_process_self();
- #if SIMGRID_VERSION < 31300
- thread_data_t *t = (thread_data_t *) SIMIX_process_self_get_data(self);
- #else
- thread_data_t *t = (thread_data_t *) SIMIX_process_self_get_data();
- #endif
- simcall_process_set_data(self, t->father_data);
- t->code(t->userparam);
- simcall_process_set_data(self, NULL);
- free(t);
- #if SIMGRID_VERSION < 32190
- return 0;
- #endif
- }
- #endif
- void _starpu_simgrid_xbt_thread_create(const char *name, starpu_pthread_attr_t *attr, void_f_pvoid_t code, void *param)
- {
- #if SIMGRID_VERSION >= 32501
- starpu_pthread_t t;
- thread_data_t *res = (thread_data_t *) malloc(sizeof(thread_data_t));
- res->userparam = param;
- res->code = code;
- starpu_pthread_create_on(name, &t, attr, _starpu_simgrid_xbt_thread_create_wrapper, res, sg_host_self());
- #else
- if (attr && attr->stacksize)
- _starpu_simgrid_set_stack_size(attr->stacksize);
- #if SIMGRID_VERSION >= 32190 || defined(HAVE_SIMCALL_PROCESS_CREATE) || defined(simcall_process_create)
- #ifdef HAVE_SMX_ACTOR_T
- smx_actor_t process STARPU_ATTRIBUTE_UNUSED;
- #else
- smx_process_t process STARPU_ATTRIBUTE_UNUSED;
- #endif
- thread_data_t *res = (thread_data_t *) malloc(sizeof(thread_data_t));
- res->userparam = param;
- res->code = code;
- #if SIMGRID_VERSION < 31300
- res->father_data = SIMIX_process_self_get_data(SIMIX_process_self());
- #else
- res->father_data = SIMIX_process_self_get_data();
- #endif
- #if SIMGRID_VERSION < 31200
- simcall_process_create(&process,
- #else
- process = simcall_process_create(
- #endif
- name,
- _starpu_simgrid_xbt_thread_create_wrapper, res,
- #if SIMGRID_VERSION < 31400
- SIMIX_host_self_get_name(),
- #else
- # if defined(HAVE_SG_HOST_SELF) || defined(sg_host_self)
- sg_host_self(),
- # else
- SIMIX_host_self(),
- # endif
- #endif
- #if SIMGRID_VERSION < 31500 || SIMGRID_VERSION == 31559
- -1.0,
- #endif
- #if SIMGRID_VERSION < 32190
- 0, NULL,
- #endif
- /*props */ NULL
- #if SIMGRID_VERSION < 31500 || SIMGRID_VERSION == 31559
- , 0
- #endif
- );
- #else
- STARPU_ABORT_MSG("Can't run StarPU-Simgrid-MPI with a Simgrid version which does not provide simcall_process_create and does not fix https://github.com/simgrid/simgrid/issues/139 , sorry.");
- #endif
- if (attr && attr->stacksize)
- _starpu_simgrid_set_stack_size(_starpu_default_stack_size);
- #endif
- }
- #endif
|