浏览代码

Add an optional "deinit_sched" method in the scheduling policy interface.

Cédric Augonnet 16 年之前
父节点
当前提交
5bcc626e42

+ 19 - 1
src/core/policies/sched_policy.c

@@ -39,7 +39,7 @@ struct sched_policy_s *get_sched_policy(void)
 void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user_conf)
 void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user_conf)
 {
 {
 	/* eager policy is taken by default */
 	/* eager policy is taken by default */
-	char *sched_pol;
+	const char *sched_pol;
 	if (user_conf && (user_conf->sched_policy))
 	if (user_conf && (user_conf->sched_policy))
 	{
 	{
 		sched_pol = user_conf->sched_policy;
 		sched_pol = user_conf->sched_policy;
@@ -54,6 +54,7 @@ void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user
 		 	fprintf(stderr, "USE WS SCHEDULER !! \n");
 		 	fprintf(stderr, "USE WS SCHEDULER !! \n");
 #endif
 #endif
 			policy.init_sched = initialize_ws_policy;
 			policy.init_sched = initialize_ws_policy;
+			policy.deinit_sched = NULL;
 			policy.get_local_queue = get_local_queue_ws;
 			policy.get_local_queue = get_local_queue_ws;
 		 }
 		 }
 		 else if (strcmp(sched_pol, "prio") == 0) {
 		 else if (strcmp(sched_pol, "prio") == 0) {
@@ -61,6 +62,7 @@ void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user
 		 	fprintf(stderr, "USE PRIO EAGER SCHEDULER !! \n");
 		 	fprintf(stderr, "USE PRIO EAGER SCHEDULER !! \n");
 #endif
 #endif
 			policy.init_sched = initialize_eager_center_priority_policy;
 			policy.init_sched = initialize_eager_center_priority_policy;
+			policy.deinit_sched = NULL;
 			policy.get_local_queue = get_local_queue_eager_priority;
 			policy.get_local_queue = get_local_queue_eager_priority;
 		 }
 		 }
 		 else if (strcmp(sched_pol, "no-prio") == 0) {
 		 else if (strcmp(sched_pol, "no-prio") == 0) {
@@ -68,6 +70,7 @@ void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user
 		 	fprintf(stderr, "USE _NO_ PRIO EAGER SCHEDULER !! \n");
 		 	fprintf(stderr, "USE _NO_ PRIO EAGER SCHEDULER !! \n");
 #endif
 #endif
 			policy.init_sched = initialize_no_prio_policy;
 			policy.init_sched = initialize_no_prio_policy;
+			policy.deinit_sched = NULL;
 			policy.get_local_queue = get_local_queue_no_prio;
 			policy.get_local_queue = get_local_queue_no_prio;
 		 }
 		 }
 		 else if (strcmp(sched_pol, "dm") == 0) {
 		 else if (strcmp(sched_pol, "dm") == 0) {
@@ -75,6 +78,7 @@ void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user
 		 	fprintf(stderr, "USE MODEL SCHEDULER !! \n");
 		 	fprintf(stderr, "USE MODEL SCHEDULER !! \n");
 #endif
 #endif
 			policy.init_sched = initialize_dm_policy;
 			policy.init_sched = initialize_dm_policy;
+			policy.deinit_sched = NULL;
 			policy.get_local_queue = get_local_queue_dm;
 			policy.get_local_queue = get_local_queue_dm;
 		 }
 		 }
 		 else if (strcmp(sched_pol, "dmda") == 0) {
 		 else if (strcmp(sched_pol, "dmda") == 0) {
@@ -82,6 +86,7 @@ void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user
 		 	fprintf(stderr, "USE DATA AWARE MODEL SCHEDULER !! \n");
 		 	fprintf(stderr, "USE DATA AWARE MODEL SCHEDULER !! \n");
 #endif
 #endif
 			policy.init_sched = initialize_dmda_policy;
 			policy.init_sched = initialize_dmda_policy;
+			policy.deinit_sched = NULL;
 			policy.get_local_queue = get_local_queue_dmda;
 			policy.get_local_queue = get_local_queue_dmda;
 		 }
 		 }
 		 else if (strcmp(sched_pol, "random") == 0) {
 		 else if (strcmp(sched_pol, "random") == 0) {
@@ -89,6 +94,7 @@ void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user
 		 	fprintf(stderr, "USE RANDOM SCHEDULER !! \n");
 		 	fprintf(stderr, "USE RANDOM SCHEDULER !! \n");
 #endif
 #endif
 			policy.init_sched = initialize_random_policy;
 			policy.init_sched = initialize_random_policy;
+			policy.deinit_sched = NULL;
 			policy.get_local_queue = get_local_queue_random;
 			policy.get_local_queue = get_local_queue_random;
 		 }
 		 }
 		 else {
 		 else {
@@ -97,6 +103,7 @@ void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user
 #endif
 #endif
 			/* default scheduler is the eager one */
 			/* default scheduler is the eager one */
 			policy.init_sched = initialize_eager_center_policy;
 			policy.init_sched = initialize_eager_center_policy;
+			policy.deinit_sched = NULL;
 			policy.get_local_queue = get_local_queue_eager;
 			policy.get_local_queue = get_local_queue_eager;
 		 }
 		 }
 	}
 	}
@@ -106,6 +113,7 @@ void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user
 #endif
 #endif
 		/* default scheduler is the eager one */
 		/* default scheduler is the eager one */
 		policy.init_sched = initialize_eager_center_policy;
 		policy.init_sched = initialize_eager_center_policy;
+		policy.deinit_sched = NULL;
 		policy.get_local_queue = get_local_queue_eager;
 		policy.get_local_queue = get_local_queue_eager;
 	}
 	}
 
 
@@ -118,6 +126,16 @@ void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user
 	policy.init_sched(config, &policy);
 	policy.init_sched(config, &policy);
 }
 }
 
 
+void deinit_sched_policy(struct machine_config_s *config)
+{
+	if (policy.deinit_sched)
+		policy.deinit_sched(config, &policy);
+
+	pthread_key_delete(policy.local_queue_key);
+	pthread_mutex_destroy(&policy.sched_activity_mutex);
+	pthread_cond_destroy(&policy.sched_activity_cond);
+}
+
 /* the generic interface that call the proper underlying implementation */
 /* the generic interface that call the proper underlying implementation */
 int push_task(job_t task)
 int push_task(job_t task)
 {
 {

+ 4 - 0
src/core/policies/sched_policy.h

@@ -31,6 +31,9 @@ struct sched_policy_s {
 	/* create all the queues */
 	/* create all the queues */
 	void (*init_sched)(struct machine_config_s *, struct sched_policy_s *);
 	void (*init_sched)(struct machine_config_s *, struct sched_policy_s *);
 
 
+	/* cleanup method at termination */
+	void (*deinit_sched)(struct machine_config_s *, struct sched_policy_s *);
+
 	/* anyone can request which queue it is associated to */
 	/* anyone can request which queue it is associated to */
 	struct jobq_s *(*get_local_queue)(struct sched_policy_s *);
 	struct jobq_s *(*get_local_queue)(struct sched_policy_s *);
 
 
@@ -44,6 +47,7 @@ struct sched_policy_s {
 struct sched_policy_s *get_sched_policy(void);
 struct sched_policy_s *get_sched_policy(void);
 
 
 void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user_conf);
 void init_sched_policy(struct machine_config_s *config, struct starpu_conf *user_conf);
+void deinit_sched_policy(struct machine_config_s *config);
 //void set_local_queue(struct jobq_s *jobq);
 //void set_local_queue(struct jobq_s *jobq);
 
 
 int push_task(job_t task);
 int push_task(job_t task);

+ 2 - 0
src/core/workers.c

@@ -488,4 +488,6 @@ void starpu_shutdown(void)
 
 
 	/* cleanup StarPU internal data structures */
 	/* cleanup StarPU internal data structures */
 	deinit_memory_nodes();
 	deinit_memory_nodes();
+
+	deinit_sched_policy(&config);
 }
 }

+ 1 - 0
src/datawizard/copy-driver.h

@@ -53,6 +53,7 @@ __attribute__((warn_unused_result))
 int driver_copy_data(struct starpu_data_state_t *state, uint32_t src_node_mask, uint32_t dst_node, unsigned donotread);
 int driver_copy_data(struct starpu_data_state_t *state, uint32_t src_node_mask, uint32_t dst_node, unsigned donotread);
 
 
 void init_memory_nodes(void);
 void init_memory_nodes(void);
+void deinit_memory_nodes(void);
 void set_local_memory_node_key(unsigned *node);
 void set_local_memory_node_key(unsigned *node);
 unsigned get_local_memory_node(void);
 unsigned get_local_memory_node(void);
 unsigned register_memory_node(node_kind kind);
 unsigned register_memory_node(node_kind kind);

+ 1 - 0
src/datawizard/data_request.h

@@ -33,6 +33,7 @@ LIST_TYPE(data_request,
 );
 );
 
 
 void init_data_request_lists(void);
 void init_data_request_lists(void);
+void deinit_data_request_lists(void);
 int post_data_request(struct starpu_data_state_t *state, uint32_t src_node, uint32_t dst_node);
 int post_data_request(struct starpu_data_state_t *state, uint32_t src_node, uint32_t dst_node);
 void handle_node_data_requests(uint32_t src_node);
 void handle_node_data_requests(uint32_t src_node);
 
 

+ 1 - 0
src/datawizard/memalloc.h

@@ -44,6 +44,7 @@ LIST_TYPE(mem_chunk,
 );
 );
 
 
 void init_mem_chunk_lists(void);
 void init_mem_chunk_lists(void);
+void deinit_mem_chunk_lists(void);
 void request_mem_chunk_removal(struct starpu_data_state_t *state, unsigned node);
 void request_mem_chunk_removal(struct starpu_data_state_t *state, unsigned node);
 int allocate_memory_on_node(struct starpu_data_state_t *state, uint32_t dst_node);
 int allocate_memory_on_node(struct starpu_data_state_t *state, uint32_t dst_node);
 size_t liberate_memory_on_node(mem_chunk_t mc, uint32_t node);
 size_t liberate_memory_on_node(mem_chunk_t mc, uint32_t node);