Pārlūkot izejas kodu

add disk flag + add flag in reclaim + add test disk_computation

Corentin Salingue 12 gadi atpakaļ
vecāks
revīzija
210ed2e470
4 mainītis faili ar 43 papildinājumiem un 7 dzēšanām
  1. 18 0
      src/core/disk.c
  2. 8 0
      src/core/disk.h
  3. 16 7
      src/datawizard/memalloc.c
  4. 1 0
      tests/Makefile.am

+ 18 - 0
src/core/disk.c

@@ -39,6 +39,8 @@ struct disk_register {
 	unsigned node;
 	void * base;
 	struct starpu_disk_ops * functions;
+	/* disk condition (1 = all authorizations,  */
+	int flag;
 };
 
 static void add_disk_in_list(unsigned node, struct starpu_disk_ops * func, void * base);
@@ -193,6 +195,7 @@ add_disk_in_list(unsigned node,  struct starpu_disk_ops * func, void * base)
 	STARPU_ASSERT(dr != NULL);
 	dr->node = node;
 	dr->base = base;
+	dr->flag = STARPU_DISK_ALL;
 	dr->functions = func;
 	disk_register_list[++disk_number] = dr;
 }
@@ -224,3 +227,18 @@ _starpu_is_same_kind_disk(unsigned node1, unsigned node2)
 	return 0;
 }
 
+
+void
+ _starpu_set_disk_flag(unsigned node, int flag)
+{
+	int pos = get_location_with_node(node);
+	disk_register_list[pos]->flag = flag;
+}
+
+
+int
+_starpu_get_disk_flag(unsigned node)
+{
+	int pos = get_location_with_node(node);
+	return disk_register_list[pos]->flag;
+}

+ 8 - 0
src/core/disk.h

@@ -20,6 +20,9 @@
 
 #define SIZE_DISK_MIN (1024*1024)
 
+#define STARPU_DISK_ALL 1
+#define STARPU_DISK_NO_RECLAIM 2
+
 /* interface to manipulate memory disk */
 void * _starpu_disk_alloc (unsigned node, size_t size);
 
@@ -39,4 +42,9 @@ int _starpu_disk_copy(unsigned node_src, void* obj_src, off_t offset_src, unsign
 
 int _starpu_is_same_kind_disk(unsigned node1, unsigned node2);
 
+/* change disk flag */
+
+void _starpu_set_disk_flag(unsigned node, int flag);
+int _starpu_get_disk_flag(unsigned node);
+
 #endif /* __DISK_H__ */

+ 16 - 7
src/datawizard/memalloc.c

@@ -18,6 +18,7 @@
 #include <datawizard/memory_manager.h>
 #include <datawizard/memalloc.h>
 #include <datawizard/footprint.h>
+#include <core/disk.h>
 #include <starpu.h>
 
 /* This per-node spinlock protect lru_list */
@@ -1026,13 +1027,17 @@ get_better_disk_can_accept_size(starpu_data_handle_t handle, unsigned node)
 		    (_starpu_memory_manager_test_allocate_size_(_starpu_data_get_size(handle), i) == 1 ||
 		     handle->per_node[i].allocated))
 		{
-			/* only time can change between disk <-> main_ram 
-			 * and not between main_ram <-> worker if we compare diks*/
-			double time_tmp = _starpu_predict_transfer_time(i, STARPU_MAIN_RAM, _starpu_data_get_size(handle));
-			if (target == -1 || time_disk > time_tmp)
+			/* if we can write on the disk */
+			if (_starpu_get_disk_flag(i) != STARPU_DISK_NO_RECLAIM)
 			{
-				target = i;
-				time_disk = time_tmp;
+				/* only time can change between disk <-> main_ram 
+				 * and not between main_ram <-> worker if we compare diks*/
+				double time_tmp = _starpu_predict_transfer_time(i, STARPU_MAIN_RAM, _starpu_data_get_size(handle));
+				if (target == -1 || time_disk > time_tmp)
+				{
+					target = i;
+					time_disk = time_tmp;
+				}
 			}	
 		}
 	}
@@ -1069,7 +1074,7 @@ choose_target(starpu_data_handle_t handle, unsigned node)
 	{
 		/* handle->home_node == -1 */
 		/* no place for datas in RAM, we push on disk */
-		if (node == 0)
+		if (node == STARPU_MAIN_RAM)
 		{
 			target = get_better_disk_can_accept_size(handle, node);
 		}
@@ -1086,5 +1091,9 @@ choose_target(starpu_data_handle_t handle, unsigned node)
 			target = get_better_disk_can_accept_size(handle, node);
 		}
 	}
+	/* we haven't the right to write on the disk */
+	if (starpu_node_get_kind(target) == STARPU_DISK_RAM && _starpu_get_disk_flag(target) == STARPU_DISK_NO_RECLAIM)
+		target = -1;
+
 	return target;
 }

+ 1 - 0
tests/Makefile.am

@@ -196,6 +196,7 @@ noinst_PROGRAMS =				\
 	datawizard/wt_broadcast			\
 	datawizard/readonly			\
 	disk/disk_copy				\
+	disk/disk_compute			\
 	errorcheck/starpu_init_noworker		\
 	errorcheck/invalid_blocking_calls	\
 	errorcheck/invalid_tasks		\