Explorar o código

add getter for per-device-type cpuset masks

Olivier Aumage %!s(int64=6) %!d(string=hai) anos
pai
achega
2baca39007
Modificáronse 3 ficheiros con 69 adicións e 0 borrados
  1. 1 0
      starpurm/include/starpurm.h
  2. 59 0
      starpurm/src/starpurm.c
  3. 9 0
      starpurm/src/starpurm_private.h

+ 1 - 0
starpurm/include/starpurm.h

@@ -138,6 +138,7 @@ hwloc_cpuset_t starpurm_get_global_cpuset(void);
 hwloc_cpuset_t starpurm_get_selected_cpuset(void);
 hwloc_cpuset_t starpurm_get_all_cpu_workers_cpuset(void);
 hwloc_cpuset_t starpurm_get_all_device_workers_cpuset(void);
+hwloc_cpuset_t starpurm_get_all_device_workers_cpuset_by_type(int typeid);
 
 #ifdef __cplusplus
 }

+ 59 - 0
starpurm/src/starpurm.c

@@ -603,8 +603,19 @@ void starpurm_initialize(void)
 	hwloc_topology_load(rm->topology);
 	rm->global_cpuset = hwloc_bitmap_alloc();
 	hwloc_bitmap_zero(rm->global_cpuset);
+	
 	rm->all_cpu_workers_cpuset = hwloc_bitmap_alloc();
 	hwloc_bitmap_zero(rm->all_cpu_workers_cpuset);
+	
+	rm->all_opencl_device_workers_cpuset = hwloc_bitmap_alloc();
+	hwloc_bitmap_zero(rm->all_opencl_device_workers_cpuset);
+	
+	rm->all_cuda_device_workers_cpuset = hwloc_bitmap_alloc();
+	hwloc_bitmap_zero(rm->all_cuda_device_workers_cpuset);
+	
+	rm->all_mic_device_workers_cpuset = hwloc_bitmap_alloc();
+	hwloc_bitmap_zero(rm->all_mic_device_workers_cpuset);
+
 	rm->all_device_workers_cpuset = hwloc_bitmap_alloc();
 	hwloc_bitmap_zero(rm->all_device_workers_cpuset);
 
@@ -705,6 +716,7 @@ void starpurm_initialize(void)
 		rm->units[unitid].worker_cpuset = starpu_worker_get_hwloc_cpuset(rm->units[unitid].workerid);
 		pthread_cond_init(&rm->units[unitid].unit_available_cond, NULL);
 		hwloc_bitmap_or(rm->global_cpuset, rm->global_cpuset, rm->units[unitid].worker_cpuset);
+		hwloc_bitmap_or(rm->all_opencl_device_workers_cpuset, rm->all_opencl_device_workers_cpuset, rm->units[unitid].worker_cpuset);
 		hwloc_bitmap_or(rm->all_device_workers_cpuset, rm->all_device_workers_cpuset, rm->units[unitid].worker_cpuset);
 		unitid++;
 	}
@@ -725,6 +737,7 @@ void starpurm_initialize(void)
 		rm->units[unitid].worker_cpuset = starpu_worker_get_hwloc_cpuset(rm->units[unitid].workerid);
 		pthread_cond_init(&rm->units[unitid].unit_available_cond, NULL);
 		hwloc_bitmap_or(rm->global_cpuset, rm->global_cpuset, rm->units[unitid].worker_cpuset);
+		hwloc_bitmap_or(rm->all_cuda_device_workers_cpuset, rm->all_cuda_device_workers_cpuset, rm->units[unitid].worker_cpuset);
 		hwloc_bitmap_or(rm->all_device_workers_cpuset, rm->all_device_workers_cpuset, rm->units[unitid].worker_cpuset);
 		unitid++;
 	}
@@ -745,6 +758,7 @@ void starpurm_initialize(void)
 		rm->units[unitid].worker_cpuset = starpu_worker_get_hwloc_cpuset(rm->units[unitid].workerid);
 		pthread_cond_init(&rm->units[unitid].unit_available_cond, NULL);
 		hwloc_bitmap_or(rm->global_cpuset, rm->global_cpuset, rm->units[unitid].worker_cpuset);
+		hwloc_bitmap_or(rm->all_mic_device_workers_cpuset, rm->all_mic_device_workers_cpuset, rm->units[unitid].worker_cpuset);
 		hwloc_bitmap_or(rm->all_device_workers_cpuset, rm->all_device_workers_cpuset, rm->units[unitid].worker_cpuset);
 		unitid++;
 	}
@@ -851,6 +865,9 @@ void starpurm_shutdown(void)
 
 	hwloc_bitmap_free(rm->global_cpuset);
 	hwloc_bitmap_free(rm->all_cpu_workers_cpuset);
+	hwloc_bitmap_free(rm->all_opencl_device_workers_cpuset);
+	hwloc_bitmap_free(rm->all_cuda_device_workers_cpuset);
+	hwloc_bitmap_free(rm->all_mic_device_workers_cpuset);
 	hwloc_bitmap_free(rm->all_device_workers_cpuset);
 	hwloc_bitmap_free(rm->selected_cpuset);
 
@@ -1576,6 +1593,33 @@ hwloc_cpuset_t starpurm_get_all_cpu_workers_cpuset(void)
 	return hwloc_bitmap_dup(rm->all_cpu_workers_cpuset);
 }
 
+static hwloc_cpuset_t starpurm_get_all_opencl_device_workers_cpuset(void)
+{
+	assert(_starpurm != NULL);
+	assert(_starpurm->state != state_uninitialized);
+	struct s_starpurm *rm = _starpurm;
+
+	return hwloc_bitmap_dup(rm->all_opencl_device_workers_cpuset);
+}
+
+static hwloc_cpuset_t starpurm_get_all_cuda_device_workers_cpuset(void)
+{
+	assert(_starpurm != NULL);
+	assert(_starpurm->state != state_uninitialized);
+	struct s_starpurm *rm = _starpurm;
+
+	return hwloc_bitmap_dup(rm->all_cuda_device_workers_cpuset);
+}
+
+static hwloc_cpuset_t starpurm_get_all_mic_device_workers_cpuset(void)
+{
+	assert(_starpurm != NULL);
+	assert(_starpurm->state != state_uninitialized);
+	struct s_starpurm *rm = _starpurm;
+
+	return hwloc_bitmap_dup(rm->all_mic_device_workers_cpuset);
+}
+
 hwloc_cpuset_t starpurm_get_all_device_workers_cpuset(void)
 {
 	assert(_starpurm != NULL);
@@ -1585,3 +1629,18 @@ hwloc_cpuset_t starpurm_get_all_device_workers_cpuset(void)
 	return hwloc_bitmap_dup(rm->all_device_workers_cpuset);
 }
 
+hwloc_cpuset_t starpurm_get_all_device_workers_cpuset_by_type(int typeid)
+{
+	assert(_starpurm != NULL);
+	assert(_starpurm->state != state_uninitialized);
+	assert(typeid != starpurm_unit_cpu);
+	if (typeid == starpurm_unit_opencl)
+		return starpurm_get_all_opencl_device_workers_cpuset();
+	if (typeid == starpurm_unit_cuda)
+		return starpurm_get_all_cuda_device_workers_cpuset();
+	if (typeid == starpurm_unit_mic)
+		return starpurm_get_all_mic_device_workers_cpuset();
+	hwloc_cpuset_t empty_bitmap = hwloc_bitmap_alloc();
+	hwloc_bitmap_zero(empty_bitmap);
+	return empty_bitmap;
+}

+ 9 - 0
starpurm/src/starpurm_private.h

@@ -79,6 +79,15 @@ struct s_starpurm
 	/* Cpuset of all StarPU CPU workers. */
 	hwloc_cpuset_t all_cpu_workers_cpuset;
 
+	/* Cpuset of all StarPU OpenCL workers. */
+	hwloc_cpuset_t all_opencl_device_workers_cpuset;
+
+	/* Cpuset of all StarPU CUDA workers. */
+	hwloc_cpuset_t all_cuda_device_workers_cpuset;
+
+	/* Cpuset of all StarPU MIC workers. */
+	hwloc_cpuset_t all_mic_device_workers_cpuset;
+
 	/* Cpuset of all StarPU device workers. */
 	hwloc_cpuset_t all_device_workers_cpuset;