Explorar el Código

Make sure to keep prefetch/fetch requests in the same order, and after traversing them, put them back before the ones that got pushed in between

Samuel Thibault hace 13 años
padre
commit
7ffec30bbe
Se han modificado 1 ficheros con 38 adiciones y 20 borrados
  1. 38 20
      src/datawizard/data_request.c

+ 38 - 20
src/datawizard/data_request.c

@@ -190,9 +190,9 @@ void _starpu_post_data_request(starpu_data_request_t r, uint32_t handling_node)
 	/* insert the request in the proper list */
 	PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[handling_node]);
 	if (r->prefetch) {
-		starpu_data_request_list_push_front(prefetch_requests[handling_node], r);
+		starpu_data_request_list_push_back(prefetch_requests[handling_node], r);
 	} else
-		starpu_data_request_list_push_front(data_requests[handling_node], r);
+		starpu_data_request_list_push_back(data_requests[handling_node], r);
 	PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[handling_node]);
 
 #ifndef STARPU_NON_BLOCKING_DRIVERS
@@ -372,6 +372,7 @@ static int starpu_handle_data_request(starpu_data_request_t r, unsigned may_allo
 void _starpu_handle_node_data_requests(uint32_t src_node, unsigned may_alloc)
 {
 	starpu_data_request_t r;
+	starpu_data_request_list_t new_data_requests;
 
 	/* take all the entries from the request list */
         PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]);
@@ -393,22 +394,27 @@ void _starpu_handle_node_data_requests(uint32_t src_node, unsigned may_alloc)
 
 	PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]);
 
+	new_data_requests = starpu_data_request_list_new();
+
 	/* for all entries of the list */
 	while (!starpu_data_request_list_empty(local_list))
 	{
                 int res;
 
-		r = starpu_data_request_list_pop_back(local_list);
+		r = starpu_data_request_list_pop_front(local_list);
 
 		res = starpu_handle_data_request(r, may_alloc);
 		if (res == -ENOMEM)
 		{
-                        PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]);
-			starpu_data_request_list_push_front(data_requests[src_node], r);
-			PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]);
+			starpu_data_request_list_push_back(new_data_requests, r);
 		}
 	}
 
+	PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]);
+	starpu_data_request_list_push_list_front(new_data_requests, data_requests[src_node]);
+	PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]);
+
+	starpu_data_request_list_delete(new_data_requests);
 	starpu_data_request_list_delete(local_list);
 }
 
@@ -416,6 +422,8 @@ void _starpu_handle_node_prefetch_requests(uint32_t src_node, unsigned may_alloc
 	starpu_memstrategy_drop_prefetch[src_node]=0;
 
 	starpu_data_request_t r;
+	starpu_data_request_list_t new_data_requests;
+	starpu_data_request_list_t new_prefetch_requests;
 
 	/* take all the entries from the request list */
         PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]);
@@ -436,47 +444,55 @@ void _starpu_handle_node_prefetch_requests(uint32_t src_node, unsigned may_alloc
 
 	PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]);
 
+	new_data_requests = starpu_data_request_list_new();
+	new_prefetch_requests = starpu_data_request_list_new();
+
 	/* for all entries of the list */
 	while (!starpu_data_request_list_empty(local_list))
 	{
                 int res;
 
-		r = starpu_data_request_list_pop_back(local_list);
+		r = starpu_data_request_list_pop_front(local_list);
 
 		res = starpu_handle_data_request(r, may_alloc);
 		if (res == -ENOMEM )
 		{
 			starpu_memstrategy_drop_prefetch[src_node]=1;
-			PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]);
 			if (r->prefetch)
-				starpu_data_request_list_push_front(prefetch_requests[src_node], r);
+				starpu_data_request_list_push_back(prefetch_requests[src_node], r);
 			else 
 			{
 				/* Prefetch request promoted while in tmp list*/
-				starpu_data_request_list_push_front(data_requests[src_node], r);
+				starpu_data_request_list_push_back(data_requests[src_node], r);
 			}
-			PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]);
 			break;
 		}
 	}
 
 	while(!starpu_data_request_list_empty(local_list) && starpu_memstrategy_drop_prefetch[src_node])
 	{
-		r = starpu_data_request_list_pop_back(local_list);
-		PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]);
+		r = starpu_data_request_list_pop_front(local_list);
 		if (r->prefetch)
 			starpu_data_request_list_push_back(prefetch_requests[src_node], r);
-		else 
-			starpu_data_request_list_push_front(data_requests[src_node], r);
-		PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]);
+		else
+			starpu_data_request_list_push_back(data_requests[src_node], r);
 	}
 
+	PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]);
+	starpu_data_request_list_push_list_front(new_data_requests, data_requests[src_node]);
+	starpu_data_request_list_push_list_front(new_prefetch_requests, prefetch_requests[src_node]);
+	PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]);
+
+	starpu_data_request_list_delete(new_data_requests);
+	starpu_data_request_list_delete(new_prefetch_requests);
 	starpu_data_request_list_delete(local_list);
 }
 
 static void _handle_pending_node_data_requests(uint32_t src_node, unsigned force)
 {
 //	_STARPU_DEBUG("_starpu_handle_pending_node_data_requests ...\n");
+//
+	starpu_data_request_list_t new_data_requests_pending = starpu_data_request_list_new();
 
 	PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]);
 
@@ -489,7 +505,7 @@ static void _handle_pending_node_data_requests(uint32_t src_node, unsigned force
 	while (!starpu_data_request_list_empty(local_list))
 	{
 		starpu_data_request_t r;
-		r = starpu_data_request_list_pop_back(local_list);
+		r = starpu_data_request_list_pop_front(local_list);
 
 		starpu_data_handle handle = r->handle;
 		
@@ -516,14 +532,16 @@ static void _handle_pending_node_data_requests(uint32_t src_node, unsigned force
 				_starpu_spin_unlock(&r->lock);
 				_starpu_spin_unlock(&handle->header_lock);
 
-				PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]);
-				starpu_data_request_list_push_front(data_requests_pending[src_node], r);
-				PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]);
+				starpu_data_request_list_push_back(new_data_requests_pending, r);
 			}
 		}
 	}
+	PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]);
+	starpu_data_request_list_push_list_back(data_requests_pending[src_node], new_data_requests_pending);
+	PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]);
 
 	starpu_data_request_list_delete(local_list);
+	starpu_data_request_list_delete(new_data_requests_pending);
 }
 
 void _starpu_handle_pending_node_data_requests(uint32_t src_node)