Преглед изворни кода

add support for choosing initially owned cpuset

Olivier Aumage пре 6 година
родитељ
комит
7d0d5beda7
4 измењених фајлова са 19 додато и 4 уклоњено
  1. 1 0
      starpurm/include/starpurm.h
  2. 14 4
      starpurm/src/starpurm.c
  3. 1 0
      starpurm/src/starpurm_dlb.c
  4. 3 0
      starpurm/src/starpurm_private.h

+ 1 - 0
starpurm/include/starpurm.h

@@ -46,6 +46,7 @@ typedef void *starpurm_block_cond_t;
 typedef int (*starpurm_polling_t)(void *);
 typedef int (*starpurm_polling_t)(void *);
 
 
 /* Resource enforcement */
 /* Resource enforcement */
+void starpurm_initialize_with_cpuset(hwloc_cpuset_t initially_owned_cpuset);
 void starpurm_initialize(void);
 void starpurm_initialize(void);
 
 
 void starpurm_shutdown(void);
 void starpurm_shutdown(void);

+ 14 - 4
starpurm/src/starpurm.c

@@ -588,7 +588,7 @@ static starpurm_drs_ret_t _starpurm_set_ncpus(unsigned int ncpus)
 }
 }
 
 
 /* Initialize rm state for StarPU */
 /* Initialize rm state for StarPU */
-void starpurm_initialize(void)
+void starpurm_initialize_with_cpuset(const hwloc_cpuset_t initially_owned_cpuset)
 {
 {
 	int ret;
 	int ret;
 	assert(_starpurm == NULL);
 	assert(_starpurm == NULL);
@@ -604,6 +604,8 @@ void starpurm_initialize(void)
 	rm->global_cpuset = hwloc_bitmap_alloc();
 	rm->global_cpuset = hwloc_bitmap_alloc();
 	hwloc_bitmap_zero(rm->global_cpuset);
 	hwloc_bitmap_zero(rm->global_cpuset);
 	
 	
+	rm->initially_owned_cpuset_mask = hwloc_bitmap_dup(initially_owned_cpuset);
+
 	rm->all_cpu_workers_cpuset = hwloc_bitmap_alloc();
 	rm->all_cpu_workers_cpuset = hwloc_bitmap_alloc();
 	hwloc_bitmap_zero(rm->all_cpu_workers_cpuset);
 	hwloc_bitmap_zero(rm->all_cpu_workers_cpuset);
 	
 	
@@ -820,15 +822,22 @@ void starpurm_initialize(void)
 		rm->starpu_in_pause = 0;
 		rm->starpu_in_pause = 0;
 	}
 	}
 
 
+#ifdef STARPURM_HAVE_DLB
+	starpurm_dlb_init(rm);
+#endif
 	pthread_mutex_lock(&rm->event_list_mutex);
 	pthread_mutex_lock(&rm->event_list_mutex);
 	rm->event_processing_enabled = 1;
 	rm->event_processing_enabled = 1;
 	pthread_cond_broadcast(&rm->event_processing_cond);
 	pthread_cond_broadcast(&rm->event_processing_cond);
 	pthread_mutex_unlock(&rm->event_list_mutex);
 	pthread_mutex_unlock(&rm->event_list_mutex);
 	_starpurm = rm;
 	_starpurm = rm;
 
 
-#ifdef STARPURM_HAVE_DLB
-	starpurm_dlb_init(rm);
-#endif
+}
+
+void starpurm_initialize()
+{
+	hwloc_cpuset_t full_cpuset = hwloc_bitmap_alloc_full();
+	starpurm_initialize_with_cpuset(full_cpuset);
+	hwloc_bitmap_free(full_cpuset);
 }
 }
 
 
 /* Free rm struct for StarPU */
 /* Free rm struct for StarPU */
@@ -870,6 +879,7 @@ void starpurm_shutdown(void)
 	hwloc_bitmap_free(rm->all_mic_device_workers_cpuset);
 	hwloc_bitmap_free(rm->all_mic_device_workers_cpuset);
 	hwloc_bitmap_free(rm->all_device_workers_cpuset);
 	hwloc_bitmap_free(rm->all_device_workers_cpuset);
 	hwloc_bitmap_free(rm->selected_cpuset);
 	hwloc_bitmap_free(rm->selected_cpuset);
+	hwloc_bitmap_free(rm->initially_owned_cpuset_mask);
 
 
 	int i;
 	int i;
 	for (i=0; i<rm->nunits; i++)
 	for (i=0; i<rm->nunits; i++)

+ 1 - 0
starpurm/src/starpurm_dlb.c

@@ -157,6 +157,7 @@ void starpurm_dlb_init(struct s_starpurm *rm)
 	CPU_ZERO(&starpurm_process_mask);
 	CPU_ZERO(&starpurm_process_mask);
 	_hwloc_cpuset_to_glibc_cpuset(rm->selected_cpuset, &starpurm_process_mask);
 	_hwloc_cpuset_to_glibc_cpuset(rm->selected_cpuset, &starpurm_process_mask);
 	starpurm_process_cpuset = hwloc_bitmap_dup(rm->selected_cpuset);
 	starpurm_process_cpuset = hwloc_bitmap_dup(rm->selected_cpuset);
+	hwloc_bitmap_and(starpurm_process_cpuset, starpurm_process_cpuset, rm->initially_owned_cpuset_mask);
 
 
 	pthread_mutex_lock(&dlb_handle_mutex);
 	pthread_mutex_lock(&dlb_handle_mutex);
 	dlb_handle = DLB_Init_sp(0, &starpurm_process_mask, "--policy=new --mode=async");
 	dlb_handle = DLB_Init_sp(0, &starpurm_process_mask, "--policy=new --mode=async");

+ 3 - 0
starpurm/src/starpurm_private.h

@@ -94,6 +94,9 @@ struct s_starpurm
 	/* Cpuset of all selected workers (CPU+devices). */
 	/* Cpuset of all selected workers (CPU+devices). */
 	hwloc_cpuset_t selected_cpuset;
 	hwloc_cpuset_t selected_cpuset;
 
 
+	/* Cpuset mask of initially owned cpuset or full if not used. */
+	hwloc_cpuset_t initially_owned_cpuset_mask;
+
 	/* maximum value among worker ids */
 	/* maximum value among worker ids */
 	int max_worker_id;
 	int max_worker_id;