Browse Source

add assert disk_register need at least SIZE Bytes, fix warnings in example and change strategy in try_to_free_mem_chunk

Corentin Salingue 12 years ago
parent
commit
457dd56ea1
3 changed files with 41 additions and 39 deletions
  1. 5 5
      examples/basic_examples/vector_scal.c
  2. 2 0
      src/core/disk.c
  3. 34 34
      src/datawizard/memalloc.c

+ 5 - 5
examples/basic_examples/vector_scal.c

@@ -124,10 +124,10 @@ int main(int argc, char **argv)
 	/* Initialize StarPU with default configuration */
 	int ret = starpu_init(NULL);
 
-	unsigned dd = starpu_disk_register(&write_on_file, (void *) "/tmp/", 1024*1024*15);
+	unsigned dd = starpu_disk_register(&write_on_file, (void *) "/tmp/", 1024*1024*1);
 
-	uintptr_t fileDD = starpu_disk_alloc(dd, sizeof(vector));
-	starpu_disk_write(dd, fileDD, (void *) vector, 0, sizeof(vector));
+	uintptr_t fileDD = (uintptr_t) starpu_disk_alloc(dd, sizeof(vector));
+	starpu_disk_write(dd, (void *) fileDD, (void *) vector, 0, sizeof(vector));
 
 
 
@@ -189,9 +189,9 @@ int main(int argc, char **argv)
         ret = starpu_opencl_unload_opencl(&opencl_program);
         STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl");
 #endif
-	starpu_disk_read(dd, fileDD, (void *) vector, 0, sizeof(vector));
+	starpu_disk_read(dd, (void *) fileDD, (void *) vector, 0, sizeof(vector));
 
-	starpu_disk_free(dd, fileDD, sizeof(vector));
+	starpu_disk_free(dd, (void *) fileDD, sizeof(vector));
 	starpu_disk_unregister(dd);
 
 	/* terminate StarPU, no task can be submitted after */

+ 2 - 0
src/core/disk.c

@@ -54,6 +54,8 @@ static int size_register_list = 2;
 unsigned
 starpu_disk_register(struct disk_ops * func, void *parameter, size_t size)
 {
+
+	STARPU_ASSERT_MSG(size >= SIZE,"Minimum disk size is %u Bytes ! (Here %u)", SIZE, size);
 	/* register disk */
 	unsigned memory_node = _starpu_memory_node_register(STARPU_DISK_RAM, 0);
 

+ 34 - 34
src/datawizard/memalloc.c

@@ -40,6 +40,7 @@ static struct _starpu_mem_chunk_list *memchunk_cache[STARPU_MAXNODES];
 const unsigned starpu_memstrategy_data_size_coefficient=2;
 
 static void starpu_lru(unsigned node);
+static int get_better_disk_can_accept_size(size_t size_handle);
 
 void _starpu_init_mem_chunk_lists(void)
 {
@@ -356,11 +357,6 @@ static size_t try_to_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node)
 
 			STARPU_ASSERT(handle->per_node[node].refcnt == 0);
 
-
-
-
-
-
 			/* in case there was nobody using that buffer, throw it
 			 * away after writing it back to main memory */
 			if (handle->home_node != -1)
@@ -370,39 +366,17 @@ static size_t try_to_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node)
 				if (node != 0)
 					target = 0;
 
-
-
-
-
 			size_t size_handle = _starpu_data_get_size(handle);
-
-			if (_starpu_memory_manager_test_allocate_size_(size_handle, STARPU_MAIN_RAM) == 1)
+			/* try to push data to RAM if we can before to push on disk*/
+			if (starpu_node_get_kind(target) == STARPU_DISK_RAM && _starpu_memory_manager_test_allocate_size_(size_handle, STARPU_MAIN_RAM) == 1)
 			{
 				target = STARPU_MAIN_RAM;
 			}
-			else
-			{	
-				
-				/* we have to push datas in disk memory */
-				unsigned nnodes = starpu_memory_nodes_get_count();
-				unsigned int i;
-				double time_disk = 0;
-				
-				for (i = 0; i < nnodes; i++)
-				{
-					if (starpu_node_get_kind(i) == STARPU_DISK_RAM && _starpu_memory_manager_test_allocate_size_(size_handle, i) == 1)
-					{
-						/* 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, size_handle);
-						if (target == -1 || time_disk > time_tmp)
-						{
-							target = i;
-							time_disk = time_tmp;
-						}	
-					}
-				}
-			}      
+			/* no place in RAM */
+			else if ((starpu_node_get_kind(target) == STARPU_DISK_RAM || target == -1) && _starpu_memory_manager_test_allocate_size_(size_handle, STARPU_MAIN_RAM) != 1)
+			{
+				target = get_better_disk_can_accept_size(size_handle);
+			}   
 
 
 			if (target != -1) {
@@ -1023,3 +997,29 @@ void starpu_data_display_memory_stats(void)
 	fprintf(stderr, "\n#---------------------\n");
 #endif
 }
+
+
+static int
+get_better_disk_can_accept_size(size_t size_handle)
+{
+	int target = -1;
+	unsigned nnodes = starpu_memory_nodes_get_count();
+	unsigned int i;
+	double time_disk = 0;
+				
+	for (i = 0; i < nnodes; i++)
+	{
+		if (starpu_node_get_kind(i) == STARPU_DISK_RAM && _starpu_memory_manager_test_allocate_size_(size_handle, i) == 1)
+		{
+			/* 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, size_handle);
+			if (target == -1 || time_disk > time_tmp)
+			{
+				target = i;
+				time_disk = time_tmp;
+			}	
+		}
+	}
+	return target;
+}