Browse Source

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 13 years ago
parent
commit
7ffec30bbe
1 changed files with 38 additions and 20 deletions
  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)