소스 검색

Fix startup of starpu-simgrid-mpi

Samuel Thibault 10 년 전
부모
커밋
48e2e4c66a
3개의 변경된 파일22개의 추가작업 그리고 11개의 파일을 삭제
  1. 14 3
      src/common/thread.c
  2. 2 8
      src/core/simgrid.c
  3. 6 0
      src/core/simgrid.h

+ 14 - 3
src/common/thread.c

@@ -48,7 +48,15 @@ int starpu_pthread_create_on(char *name, starpu_pthread_t *thread, const starpu_
 	xbt_dynar_t _hosts;
 	_args->f = start_routine;
 	_args->arg = arg;
-	_hosts = MSG_hosts_as_dynar();
+	if (_starpu_simgrid_running_smpi())
+	{
+		char asname[32];
+		STARPU_ASSERT(starpu_mpi_world_rank);
+		snprintf(asname, sizeof(asname), STARPU_MPI_AS_PREFIX"%u", starpu_mpi_world_rank());
+		_hosts = MSG_environment_as_get_hosts(_starpu_simgrid_get_as_by_name(asname));
+	}
+	else
+		_hosts = MSG_hosts_as_dynar();
 	*thread = MSG_process_create(name, _starpu_simgrid_thread_start, _args,
 			   xbt_dynar_get_as(_hosts, (where), msg_host_t));
 	xbt_dynar_free(&_hosts);
@@ -194,13 +202,16 @@ int starpu_pthread_key_delete(starpu_pthread_key_t key)
 int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer)
 {
 	void **array = MSG_host_get_data(MSG_host_self());
-	array[key] = pointer;
+	array[key] = (void*) pointer;
 	return 0;
 }
 
 void* starpu_pthread_getspecific(starpu_pthread_key_t key)
 {
-	void **array = MSG_host_get_data(MSG_host_self());
+	msg_host_t host = MSG_host_self();
+	if (!host)
+		return NULL;
+	void **array = MSG_host_get_data(host);
 	return array[key];
 }
 

+ 2 - 8
src/core/simgrid.c

@@ -28,18 +28,12 @@
 #include <msg/msg.h>
 #include <sys/resource.h>
 
-#define STARPU_MPI_AS_PREFIX "StarPU-MPI"
-
 #pragma weak starpu_main
 extern int starpu_main(int argc, char *argv[]);
 #pragma weak smpi_main
 extern int smpi_main(int (*realmain) (int argc, char *argv[]), int argc, char *argv[]);
 #pragma weak smpi_simulated_main_
 extern int smpi_simulated_main_(int argc, char *argv[]);
-#pragma weak starpu_mpi_world_rank
-extern int starpu_mpi_world_rank(void);
-
-#define _starpu_simgrid_running_smpi() (getenv("SMPI_GLOBAL_SIZE") != NULL)
 
 struct main_args
 {
@@ -55,7 +49,7 @@ int do_starpu_main(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBU
 
 #ifdef HAVE_MSG_ENVIRONMENT_GET_ROUTING_ROOT
 #ifdef HAVE_MSG_GET_AS_BY_NAME
-static msg_as_t _starpu_simgrid_get_as_by_name(const char *name)
+msg_as_t _starpu_simgrid_get_as_by_name(const char *name)
 {
 	return MSG_get_as_by_name(name);
 }
@@ -77,7 +71,7 @@ static msg_as_t __starpu_simgrid_get_as_by_name(msg_as_t root, const char *name)
 	return NULL;
 }
 
-static msg_as_t _starpu_simgrid_get_as_by_name(const char *name)
+msg_as_t _starpu_simgrid_get_as_by_name(const char *name)
 {
 	return __starpu_simgrid_get_as_by_name(MSG_environment_get_routing_root(), name);
 }

+ 6 - 0
src/core/simgrid.h

@@ -30,6 +30,9 @@ struct _starpu_pthread_args
 
 #define MAX_TSD 16
 
+#define STARPU_MPI_AS_PREFIX "StarPU-MPI"
+#define _starpu_simgrid_running_smpi() (getenv("SMPI_GLOBAL_SIZE") != NULL)
+
 void _starpu_simgrid_init(void);
 void _starpu_simgrid_wait_tasks(int workerid);
 void _starpu_simgrid_submit_job(int workerid, struct _starpu_job *job, struct starpu_perfmodel_arch* perf_arch, double length, unsigned *finished, starpu_pthread_mutex_t *mutex, starpu_pthread_cond_t *cond);
@@ -39,6 +42,9 @@ int _starpu_simgrid_get_nbhosts(const char *prefix);
 unsigned long long _starpu_simgrid_get_memsize(const char *prefix, unsigned devid);
 msg_host_t _starpu_simgrid_get_host_by_name(const char *name);
 void _starpu_simgrid_get_platform_path(char *path, size_t maxlen);
+msg_as_t _starpu_simgrid_get_as_by_name(const char *name);
+#pragma weak starpu_mpi_world_rank
+extern int starpu_mpi_world_rank(void);
 #endif
 
 #endif // __SIMGRID_H__