Explorar o código

can push data on disk if main_ram is full

Corentin Salingue %!s(int64=12) %!d(string=hai) anos
pai
achega
8712ec859a
Modificáronse 2 ficheiros con 58 adicións e 3 borrados
  1. 43 3
      src/datawizard/memalloc.c
  2. 15 0
      src/datawizard/memory_manager.c

+ 43 - 3
src/datawizard/memalloc.c

@@ -341,12 +341,52 @@ static size_t try_to_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node)
 #endif
 
 			/* in case there was nobody using that buffer, throw it
-			 * away after writing it back to main memory */
-			transfer_subtree_to_node(handle, node, 0);
+			 * away after writing it back to main memory if we can*/
+
+			size_t size_handle = _starpu_data_get_size(handle);
+
+			if (_starpu_memory_manager_test_allocate_size_(size_handle, STARPU_MAIN_RAM) == 1)
+			{
+				transfer_subtree_to_node(handle, node, STARPU_MAIN_RAM);
 
 #ifdef STARPU_MEMORY_STATS
-			_starpu_memory_handle_stats_loaded_owner(handle, 0);
+				_starpu_memory_handle_stats_loaded_owner(handle, STARPU_MAIN_RAM);
 #endif
+			}
+			else
+			{	
+				
+				/* we have to push datas in disk memory */
+				unsigned nnodes = starpu_memory_nodes_get_count();
+				unsigned int i;
+				double time_disk = 0;
+				unsigned 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 (disk == 0 || time_disk > time_tmp)
+						{
+							disk = i;
+							time_disk = time_tmp;
+						}	
+					}
+				}
+
+				STARPU_ASSERT_MSG(disk != 0, "MEMORY FULL");
+
+				/* transfer */
+				transfer_subtree_to_node(handle, node, disk);
+
+#ifdef STARPU_MEMORY_STATS
+				_starpu_memory_handle_stats_loaded_owner(handle, disk);
+#endif				
+				
+			}      
 			STARPU_ASSERT(handle->per_node[node].refcnt == 0);
 
 			/* now the actual buffer may be freed */

+ 15 - 0
src/datawizard/memory_manager.c

@@ -86,3 +86,18 @@ starpu_ssize_t starpu_memory_get_available(unsigned node)
 	else
 		return global_size[node] - used_size[node];
 }
+
+int _starpu_memory_manager_test_allocate_size_(size_t size, unsigned node)
+{
+	int ret;
+
+	STARPU_PTHREAD_MUTEX_LOCK(&lock_nodes[node]);
+	if (global_size[node] == 0)
+		ret = 1;
+	else if (used_size[node] + size <= global_size[node])
+		ret = 1;
+	else
+		ret = 0;
+	STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]);
+	return ret;
+}