瀏覽代碼

mpi: better deal with cleaning of early data structures

Nathalie Furmento 8 年之前
父節點
當前提交
50d3906bb0
共有 4 個文件被更改,包括 11 次插入72 次删除
  1. 5 8
      mpi/src/starpu_mpi.c
  2. 4 62
      mpi/src/starpu_mpi_early_data.c
  3. 1 2
      mpi/src/starpu_mpi_early_data.h
  4. 1 0
      mpi/src/starpu_mpi_private.h

+ 5 - 8
mpi/src/starpu_mpi.c

@@ -139,6 +139,7 @@ static void _starpu_mpi_request_init(struct _starpu_mpi_req **req)
 	(*req)->size_req = 0;
 	(*req)->internal_req = NULL;
 	(*req)->is_internal_req = 0;
+	(*req)->early_data_handle = NULL;
 	(*req)->envelope = NULL;
 	(*req)->sequential_consistency = 1;
 }
@@ -238,6 +239,7 @@ static void _starpu_mpi_submit_ready_request(void *arg)
 				STARPU_ASSERT(req->data_handle != early_data_handle->handle);
 
 				req->internal_req = early_data_handle->req;
+				req->early_data_handle = early_data_handle;
 
 				struct _starpu_mpi_early_data_cb_args *cb_args = malloc(sizeof(struct _starpu_mpi_early_data_cb_args));
 				cb_args->data_handle = req->data_handle;
@@ -931,12 +933,8 @@ static void _starpu_mpi_handle_request_termination(struct _starpu_mpi_req *req)
 
 	if (req->internal_req)
 	{
-		struct _starpu_mpi_early_data_handle *early_data_handle = _starpu_mpi_early_data_find(&req->node_tag);
-		STARPU_MPI_ASSERT_MSG(early_data_handle, "Could not find a copy data handle with the tag %d and the node %d\n", req->node_tag.data_tag, req->node_tag.rank);
-		_STARPU_MPI_DEBUG(3, "Handling deleting of early_data structure from the hashmap..\n");
-		_starpu_mpi_early_data_delete(early_data_handle);
-		free(early_data_handle);
-		early_data_handle = NULL;
+		free(req->early_data_handle);
+		req->early_data_handle = NULL;
 	}
 	else
 	{
@@ -1036,8 +1034,7 @@ static void _starpu_mpi_early_data_cb(void* arg)
 		if (args->req->detached)
 		{
 			_starpu_mpi_handle_request_termination(args->req);
-			free(args->req);
-			args->req = NULL;
+			_starpu_mpi_request_destroy(args->req);
 		}
 		else
 		{

+ 4 - 62
mpi/src/starpu_mpi_early_data.c

@@ -42,7 +42,7 @@ void _starpu_mpi_early_data_init(void)
 
 void _starpu_mpi_early_data_check_termination(void)
 {
-	STARPU_ASSERT_MSG(_starpu_mpi_early_data_handle_hashmap_count == 0, "Number of unexpected received messages left is not zero, did you forget to post a receive corresponding to a send?");
+	STARPU_ASSERT_MSG(_starpu_mpi_early_data_handle_hashmap_count == 0, "Number of unexpected received messages left is not zero (but %d), did you forget to post a receive corresponding to a send?", _starpu_mpi_early_data_handle_hashmap_count);
 }
 
 void _starpu_mpi_early_data_free(void)
@@ -70,35 +70,7 @@ struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_create(struct _star
 	return early_data_handle;
 }
 
-#ifdef STARPU_VERBOSE
-static void _starpu_mpi_early_data_handle_display_hash(struct _starpu_mpi_node_tag *node_tag)
-{
-	struct _starpu_mpi_early_data_handle_hashlist *hashlist;
-
-	HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, node_tag, sizeof(struct _starpu_mpi_node_tag), hashlist);
-	if (hashlist == NULL)
-	{
-		_STARPU_MPI_DEBUG(60, "Hashlist for comm %d source %d and tag %d does not exist\n", node_tag->comm, node_tag->rank, node_tag->data_tag);
-	}
-	else if (_starpu_mpi_early_data_handle_list_empty(hashlist->list))
-	{
-		_STARPU_MPI_DEBUG(60, "Hashlist for comm %d source %d and tag %d is empty\n", node_tag->comm, node_tag->rank, node_tag->data_tag);
-	}
-	else
-	{
-		struct _starpu_mpi_early_data_handle *cur;
-		for (cur = _starpu_mpi_early_data_handle_list_begin(hashlist->list) ;
-		     cur != _starpu_mpi_early_data_handle_list_end(hashlist->list);
-		     cur = _starpu_mpi_early_data_handle_list_next(cur))
-		{
-			_STARPU_MPI_DEBUG(60, "Element for comm %d source %d and tag %d: %p\n", node_tag->comm, node_tag->rank, node_tag->data_tag, cur);
-		}
-	}
-}
-#endif
-
-static
-struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_pop(struct _starpu_mpi_node_tag *node_tag, int delete)
+struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_find(struct _starpu_mpi_node_tag *node_tag)
 {
 	struct _starpu_mpi_early_data_handle_hashlist *hashlist;
 	struct _starpu_mpi_early_data_handle *early_data_handle;
@@ -118,14 +90,8 @@ struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_pop(struct _starpu_
 		}
 		else
 		{
-			if (delete == 1)
-			{
-				early_data_handle = _starpu_mpi_early_data_handle_list_pop_front(hashlist->list);
-			}
-			else
-			{
-				early_data_handle = _starpu_mpi_early_data_handle_list_front(hashlist->list);
-			}
+			_starpu_mpi_early_data_handle_hashmap_count --;
+			early_data_handle = _starpu_mpi_early_data_handle_list_pop_front(hashlist->list);
 		}
 	}
 	_STARPU_MPI_DEBUG(60, "Found early_data_handle %p with comm %d source %d tag %d\n", early_data_handle, node_tag->comm, node_tag->rank, node_tag->data_tag);
@@ -133,11 +99,6 @@ struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_pop(struct _starpu_
 	return early_data_handle;
 }
 
-struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_find(struct _starpu_mpi_node_tag *node_tag)
-{
-	return _starpu_mpi_early_data_pop(node_tag, 0);
-}
-
 void _starpu_mpi_early_data_add(struct _starpu_mpi_early_data_handle *early_data_handle)
 {
 	STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_data_handle_mutex);
@@ -155,25 +116,6 @@ void _starpu_mpi_early_data_add(struct _starpu_mpi_early_data_handle *early_data
 	}
 	_starpu_mpi_early_data_handle_list_push_back(hashlist->list, early_data_handle);
 	_starpu_mpi_early_data_handle_hashmap_count ++;
-#ifdef STARPU_VERBOSE
-	_starpu_mpi_early_data_handle_display_hash(&hashlist->node_tag);
-#endif
 	STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_data_handle_mutex);
 }
 
-void _starpu_mpi_early_data_delete(struct _starpu_mpi_early_data_handle *early_data_handle)
-{
-	_STARPU_MPI_DEBUG(60, "Trying to delete early_data_handle %p with comm %d source %d tag %d\n", early_data_handle, early_data_handle->node_tag.comm,
-			  early_data_handle->node_tag.rank, early_data_handle->node_tag.data_tag);
-	struct _starpu_mpi_early_data_handle *found = _starpu_mpi_early_data_pop(&early_data_handle->node_tag, 1);
-
-	STARPU_ASSERT_MSG(found == early_data_handle,
-			  "[_starpu_mpi_early_data_delete][error] early_data_handle %p with comm %d source %d tag %d is NOT available\n",
-			  early_data_handle, early_data_handle->node_tag.comm, early_data_handle->node_tag.rank, early_data_handle->node_tag.data_tag);
-
-	_starpu_mpi_early_data_handle_hashmap_count --;
-#ifdef STARPU_VERBOSE
-	_starpu_mpi_early_data_handle_display_hash(&early_data_handle->node_tag);
-#endif
-}
-

+ 1 - 2
mpi/src/starpu_mpi_early_data.h

@@ -1,7 +1,7 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
  * Copyright (C) 2009, 2010-2014, 2016  Université de Bordeaux
- * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015  CNRS
+ * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016  CNRS
  *
  * StarPU is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -47,7 +47,6 @@ void _starpu_mpi_early_data_free(void);
 struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_create(struct _starpu_mpi_envelope *envelope, int source, MPI_Comm comm) STARPU_ATTRIBUTE_MALLOC;
 struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_find(struct _starpu_mpi_node_tag *node_tag);
 void _starpu_mpi_early_data_add(struct _starpu_mpi_early_data_handle *early_data_handle);
-void _starpu_mpi_early_data_delete(struct _starpu_mpi_early_data_handle *early_data_handle);
 
 #ifdef __cplusplus
 }

+ 1 - 0
mpi/src/starpu_mpi_private.h

@@ -213,6 +213,7 @@ LIST_TYPE(_starpu_mpi_req,
 
 	int is_internal_req;
 	struct _starpu_mpi_req *internal_req;
+	struct _starpu_mpi_early_data_handle *early_data_handle;
 
 	int sequential_consistency;