Prechádzať zdrojové kódy

use dlb borrow/return on unselected initial mask

Olivier Aumage 6 rokov pred
rodič
commit
853315dda2
1 zmenil súbory, kde vykonal 48 pridanie a 8 odobranie
  1. 48 8
      starpurm/src/starpurm_dlb.c

+ 48 - 8
starpurm/src/starpurm_dlb.c

@@ -45,6 +45,7 @@
 
 static dlb_handler_t      dlb_handle;
 static cpu_set_t          starpurm_process_mask;
+static hwloc_cpuset_t     starpurm_process_cpuset;
 static struct s_starpurm *_starpurm = NULL;
 static pthread_mutex_t dlb_handle_mutex = PTHREAD_MUTEX_INITIALIZER;
 
@@ -75,10 +76,28 @@ int starpurm_dlb_notify_starpu_worker_mask_going_to_sleep(const hwloc_cpuset_t h
 	pthread_mutex_lock(&dlb_handle_mutex);
 	if (dlb_handle != NULL)
 	{
-		cpu_set_t glibc_workers_cpuset;
-		CPU_ZERO(&glibc_workers_cpuset);
-		_hwloc_cpuset_to_glibc_cpuset(hwloc_workers_cpuset, &glibc_workers_cpuset);
-		DLB_LendCpuMask_sp(dlb_handle, &glibc_workers_cpuset);
+		hwloc_cpuset_t hwloc_to_lend_cpuset = hwloc_bitmap_alloc();
+		hwloc_cpuset_t hwloc_to_return_cpuset = hwloc_bitmap_alloc();
+		hwloc_bitmap_zero(hwloc_to_lend_cpuset);
+		hwloc_bitmap_zero(hwloc_to_return_cpuset);
+		hwloc_bitmap_and(hwloc_to_lend_cpuset, hwloc_workers_cpuset, starpurm_process_cpuset);
+		hwloc_bitmap_andnot(hwloc_to_return_cpuset, hwloc_workers_cpuset, starpurm_process_cpuset);
+		if (!hwloc_bitmap_iszero(hwloc_to_lend_cpuset))
+		{
+			cpu_set_t glibc_to_lend_cpuset;
+			CPU_ZERO(&glibc_to_lend_cpuset);
+			_hwloc_cpuset_to_glibc_cpuset(hwloc_to_lend_cpuset, &glibc_to_lend_cpuset);
+			DLB_LendCpuMask_sp(dlb_handle, &glibc_to_lend_cpuset);
+		}
+		if (!hwloc_bitmap_iszero(hwloc_to_return_cpuset))
+		{
+			cpu_set_t glibc_to_return_cpuset;
+			CPU_ZERO(&glibc_to_return_cpuset);
+			_hwloc_cpuset_to_glibc_cpuset(hwloc_to_return_cpuset, &glibc_to_return_cpuset);
+			DLB_ReturnCpuMask_sp(dlb_handle, &glibc_to_return_cpuset);
+		}
+		hwloc_bitmap_free(hwloc_to_lend_cpuset);
+		hwloc_bitmap_free(hwloc_to_return_cpuset);
 		status = 1;
 	}
 	pthread_mutex_unlock(&dlb_handle_mutex);
@@ -91,10 +110,28 @@ int starpurm_dlb_notify_starpu_worker_mask_waking_up(const hwloc_cpuset_t hwloc_
 	pthread_mutex_lock(&dlb_handle_mutex);
 	if (dlb_handle != NULL)
 	{
-		cpu_set_t glibc_workers_cpuset;
-		CPU_ZERO(&glibc_workers_cpuset);
-		_hwloc_cpuset_to_glibc_cpuset(hwloc_workers_cpuset, &glibc_workers_cpuset);
-		DLB_ReclaimCpuMask_sp(dlb_handle, &glibc_workers_cpuset);
+		hwloc_cpuset_t hwloc_to_reclaim_cpuset = hwloc_bitmap_alloc();
+		hwloc_cpuset_t hwloc_to_borrow_cpuset = hwloc_bitmap_alloc();
+		hwloc_bitmap_zero(hwloc_to_reclaim_cpuset);
+		hwloc_bitmap_zero(hwloc_to_borrow_cpuset);
+		hwloc_bitmap_and(hwloc_to_reclaim_cpuset, hwloc_workers_cpuset, starpurm_process_cpuset);
+		hwloc_bitmap_andnot(hwloc_to_borrow_cpuset, hwloc_workers_cpuset, starpurm_process_cpuset);
+		if (!hwloc_bitmap_iszero(hwloc_to_reclaim_cpuset))
+		{
+			cpu_set_t glibc_to_reclaim_cpuset;
+			CPU_ZERO(&glibc_to_reclaim_cpuset);
+			_hwloc_cpuset_to_glibc_cpuset(hwloc_to_reclaim_cpuset, &glibc_to_reclaim_cpuset);
+			DLB_ReclaimCpuMask_sp(dlb_handle, &glibc_to_reclaim_cpuset);
+		}
+		if (!hwloc_bitmap_iszero(hwloc_to_borrow_cpuset))
+		{
+			cpu_set_t glibc_to_borrow_cpuset;
+			CPU_ZERO(&glibc_to_borrow_cpuset);
+			_hwloc_cpuset_to_glibc_cpuset(hwloc_to_borrow_cpuset, &glibc_to_borrow_cpuset);
+			DLB_BorrowCpuMask_sp(dlb_handle, &glibc_to_borrow_cpuset);
+		}
+		hwloc_bitmap_free(hwloc_to_reclaim_cpuset);
+		hwloc_bitmap_free(hwloc_to_borrow_cpuset);
 		status = 1;
 	}
 	pthread_mutex_unlock(&dlb_handle_mutex);
@@ -119,6 +156,7 @@ void starpurm_dlb_init(struct s_starpurm *rm)
 
 	CPU_ZERO(&starpurm_process_mask);
 	_hwloc_cpuset_to_glibc_cpuset(rm->selected_cpuset, &starpurm_process_mask);
+	starpurm_process_cpuset = hwloc_bitmap_dup(rm->selected_cpuset);
 
 	pthread_mutex_lock(&dlb_handle_mutex);
 	dlb_handle = DLB_Init_sp(0, &starpurm_process_mask, "--policy=new --mode=async");
@@ -144,9 +182,11 @@ void starpurm_dlb_exit(void)
 
 	/* lend every resources that StarPU may still have */
 	DLB_Lend_sp(dlb_handle_save);
+	DLB_Return_sp(dlb_handle_save);
 
 	pthread_mutex_lock(&dlb_handle_mutex);
 	DLB_Disable_sp(dlb_handle_save);
 	DLB_Finalize_sp(dlb_handle_save);
+	hwloc_bitmap_free(starpurm_process_cpuset);
 	pthread_mutex_unlock(&dlb_handle_mutex);
 }