Browse Source

make openmp support call simgrid early initialization before using pthread functions

Samuel Thibault 8 years ago
parent
commit
68dc8da493
3 changed files with 15 additions and 3 deletions
  1. 6 3
      src/core/simgrid.c
  2. 2 0
      src/core/simgrid.h
  3. 7 0
      src/util/openmp_runtime_support.c

+ 6 - 3
src/core/simgrid.c

@@ -226,10 +226,13 @@ int _starpu_smpi_simulated_main_(int argc, char *argv[])
 int smpi_simulated_main_(int argc, char *argv[]) __attribute__((weak, alias("_starpu_smpi_simulated_main_")));
 
 /* This is used to start a non-MPI simgrid environment */
-static void start_simgrid(int *argc, char **argv)
+void _starpu_start_simgrid(int *argc, char **argv)
 {
 	char path[256];
 
+	if (simgrid_started)
+		return;
+
 	simgrid_started = 1;
 
 	MSG_init(argc, argv);
@@ -296,7 +299,7 @@ int main(int argc, char **argv)
 	}
 
 	/* Managed to catch application's main, initialize simgrid first */
-	start_simgrid(&argc, argv);
+	_starpu_start_simgrid(&argc, argv);
 
 	/* Create a simgrid process for main */
 	char **argv_cpy;
@@ -338,7 +341,7 @@ void _starpu_simgrid_init_early(int *argc STARPU_ATTRIBUTE_UNUSED, char ***argv
 		/* Start maestro as a separate thread */
 		SIMIX_set_maestro(maestro, NULL);
 		/* Initialize simgrid */
-		start_simgrid(argc, *argv);
+		_starpu_start_simgrid(argc, *argv);
 		/* And attach the main thread to the main simgrid process */
 		void **tsd;
 		_STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*));

+ 2 - 0
src/core/simgrid.h

@@ -42,6 +42,8 @@ struct _starpu_pthread_args
 #define STARPU_MPI_AS_PREFIX "StarPU-MPI"
 #define _starpu_simgrid_running_smpi() (getenv("SMPI_GLOBAL_SIZE") != NULL)
 
+void _starpu_start_simgrid(int *argc, char **argv);
+
 void _starpu_simgrid_init_early(int *argc, char ***argv);
 void _starpu_simgrid_init(void);
 void _starpu_simgrid_deinit(void);

+ 7 - 0
src/util/openmp_runtime_support.c

@@ -920,6 +920,13 @@ void _starpu_omp_dummy_shutdown(void)
  */
 int starpu_omp_init(void)
 {
+#ifdef STARPU_SIMGRID
+	/* XXX: ideally we'd pass the real argc/argv */
+	int argc;
+	char *argv[] = { NULL };
+	_starpu_start_simgrid(&argc, &argv);
+#endif
+
 	_starpu_omp_global_state = &_global_state;
 
 	STARPU_PTHREAD_KEY_CREATE(&omp_thread_key, NULL);