|
@@ -20,19 +20,11 @@
|
|
#include <mpi/starpu_mpi_early_data.h>
|
|
#include <mpi/starpu_mpi_early_data.h>
|
|
#include <mpi/starpu_mpi_mpi_backend.h>
|
|
#include <mpi/starpu_mpi_mpi_backend.h>
|
|
#include <starpu_mpi_private.h>
|
|
#include <starpu_mpi_private.h>
|
|
-#include <common/uthash.h>
|
|
|
|
|
|
|
|
#ifdef STARPU_USE_MPI_MPI
|
|
#ifdef STARPU_USE_MPI_MPI
|
|
|
|
|
|
/** the hashlist is on 2 levels, the first top level is indexed on (node, rank), the second lower level is indexed on the data tag */
|
|
/** the hashlist is on 2 levels, the first top level is indexed on (node, rank), the second lower level is indexed on the data tag */
|
|
|
|
|
|
-struct _starpu_mpi_early_data_handle_tag_hashlist
|
|
|
|
-{
|
|
|
|
- struct _starpu_mpi_early_data_handle_list list;
|
|
|
|
- UT_hash_handle hh;
|
|
|
|
- starpu_mpi_tag_t data_tag;
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
struct _starpu_mpi_early_data_handle_hashlist
|
|
struct _starpu_mpi_early_data_handle_hashlist
|
|
{
|
|
{
|
|
struct _starpu_mpi_early_data_handle_tag_hashlist *datahash;
|
|
struct _starpu_mpi_early_data_handle_tag_hashlist *datahash;
|
|
@@ -74,9 +66,11 @@ void _starpu_mpi_early_data_shutdown(void)
|
|
struct _starpu_mpi_early_data_handle_hashlist *current=NULL, *tmp=NULL;
|
|
struct _starpu_mpi_early_data_handle_hashlist *current=NULL, *tmp=NULL;
|
|
HASH_ITER(hh, _starpu_mpi_early_data_handle_hashmap, current, tmp)
|
|
HASH_ITER(hh, _starpu_mpi_early_data_handle_hashmap, current, tmp)
|
|
{
|
|
{
|
|
|
|
+ _STARPU_MPI_DEBUG(600, "Hash early_data with comm %ld source %d\n", (long int) current->node.comm, current->node.rank);
|
|
struct _starpu_mpi_early_data_handle_tag_hashlist *tag_entry=NULL, *tag_tmp=NULL;
|
|
struct _starpu_mpi_early_data_handle_tag_hashlist *tag_entry=NULL, *tag_tmp=NULL;
|
|
HASH_ITER(hh, current->datahash, tag_entry, tag_tmp)
|
|
HASH_ITER(hh, current->datahash, tag_entry, tag_tmp)
|
|
{
|
|
{
|
|
|
|
+ _STARPU_MPI_DEBUG(600, "Hash 2nd level with tag %ld\n", tag_entry->data_tag);
|
|
STARPU_ASSERT(_starpu_mpi_early_data_handle_list_empty(&tag_entry->list));
|
|
STARPU_ASSERT(_starpu_mpi_early_data_handle_list_empty(&tag_entry->list));
|
|
HASH_DEL(current->datahash, tag_entry);
|
|
HASH_DEL(current->datahash, tag_entry);
|
|
free(tag_entry);
|
|
free(tag_entry);
|
|
@@ -106,10 +100,11 @@ struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_find(struct _starpu
|
|
struct _starpu_mpi_early_data_handle *early_data_handle;
|
|
struct _starpu_mpi_early_data_handle *early_data_handle;
|
|
|
|
|
|
STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_data_handle_mutex);
|
|
STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_data_handle_mutex);
|
|
- _STARPU_MPI_DEBUG(60, "Looking for early_data_handle with comm %ld source %d tag %ld\n", (long int)node_tag->comm, node_tag->rank, node_tag->data_tag);
|
|
|
|
|
|
+ _STARPU_MPI_DEBUG(60, "Looking for early_data_handle with comm %ld source %d tag %ld\n", (long int)node_tag->node.comm, node_tag->node.rank, node_tag->data_tag);
|
|
HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, &node_tag->node, sizeof(struct _starpu_mpi_node), hashlist);
|
|
HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, &node_tag->node, sizeof(struct _starpu_mpi_node), hashlist);
|
|
if (hashlist == NULL)
|
|
if (hashlist == NULL)
|
|
{
|
|
{
|
|
|
|
+ _STARPU_MPI_DEBUG(600, "No entry for (comm %ld, source %d)\n", (long int)node_tag->node.comm, node_tag->node.rank);
|
|
early_data_handle = NULL;
|
|
early_data_handle = NULL;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -118,10 +113,12 @@ struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_find(struct _starpu
|
|
HASH_FIND(hh, hashlist->datahash, &node_tag->data_tag, sizeof(starpu_mpi_tag_t), tag_hashlist);
|
|
HASH_FIND(hh, hashlist->datahash, &node_tag->data_tag, sizeof(starpu_mpi_tag_t), tag_hashlist);
|
|
if (tag_hashlist == NULL)
|
|
if (tag_hashlist == NULL)
|
|
{
|
|
{
|
|
|
|
+ _STARPU_MPI_DEBUG(600, "No entry for tag %ld\n", node_tag->data_tag);
|
|
early_data_handle = NULL;
|
|
early_data_handle = NULL;
|
|
}
|
|
}
|
|
else if (_starpu_mpi_early_data_handle_list_empty(&tag_hashlist->list))
|
|
else if (_starpu_mpi_early_data_handle_list_empty(&tag_hashlist->list))
|
|
{
|
|
{
|
|
|
|
+ _STARPU_MPI_DEBUG(600, "List empty for tag %ld\n", node_tag->data_tag);
|
|
early_data_handle = NULL;
|
|
early_data_handle = NULL;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -130,16 +127,38 @@ struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_find(struct _starpu
|
|
early_data_handle = _starpu_mpi_early_data_handle_list_pop_front(&tag_hashlist->list);
|
|
early_data_handle = _starpu_mpi_early_data_handle_list_pop_front(&tag_hashlist->list);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- _STARPU_MPI_DEBUG(60, "Found early_data_handle %p with comm %ld source %d tag %ld\n", early_data_handle, (long int)node_tag->comm, node_tag->rank, node_tag->data_tag);
|
|
|
|
|
|
+ _STARPU_MPI_DEBUG(60, "Found early_data_handle %p with comm %ld source %d tag %ld\n", early_data_handle, (long int)node_tag->node.comm, node_tag->node.rank, node_tag->data_tag);
|
|
STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_data_handle_mutex);
|
|
STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_data_handle_mutex);
|
|
return early_data_handle;
|
|
return early_data_handle;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+struct _starpu_mpi_early_data_handle_tag_hashlist *_starpu_mpi_early_data_extract(struct _starpu_mpi_node_tag *node_tag)
|
|
|
|
+{
|
|
|
|
+ struct _starpu_mpi_early_data_handle_hashlist *hashlist;
|
|
|
|
+ struct _starpu_mpi_early_data_handle_tag_hashlist *tag_hashlist = NULL;
|
|
|
|
+
|
|
|
|
+ STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_data_handle_mutex);
|
|
|
|
+ _STARPU_MPI_DEBUG(60, "Looking for hashlist for (comm %ld, source %d)\n", (long int)node_tag->node.comm, node_tag->node.rank);
|
|
|
|
+ HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, &node_tag->node, sizeof(struct _starpu_mpi_node), hashlist);
|
|
|
|
+ if (hashlist)
|
|
|
|
+ {
|
|
|
|
+ _STARPU_MPI_DEBUG(60, "Looking for hashlist for (tag %ld)\n", node_tag->data_tag);
|
|
|
|
+ HASH_FIND(hh, hashlist->datahash, &node_tag->data_tag, sizeof(starpu_mpi_tag_t), tag_hashlist);
|
|
|
|
+ if (tag_hashlist)
|
|
|
|
+ {
|
|
|
|
+ _starpu_mpi_early_data_handle_hashmap_count -= _starpu_mpi_early_data_handle_list_size(&tag_hashlist->list);
|
|
|
|
+ HASH_DEL(hashlist->datahash, tag_hashlist);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ _STARPU_MPI_DEBUG(60, "Found hashlist %p for (comm %ld, source %d) and (tag %ld)\n", tag_hashlist, (long int)node_tag->node.comm, node_tag->node.rank, node_tag->data_tag);
|
|
|
|
+ STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_data_handle_mutex);
|
|
|
|
+ return tag_hashlist;
|
|
|
|
+}
|
|
|
|
+
|
|
void _starpu_mpi_early_data_add(struct _starpu_mpi_early_data_handle *early_data_handle)
|
|
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);
|
|
STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_data_handle_mutex);
|
|
- _STARPU_MPI_DEBUG(60, "Trying to add early_data_handle %p with comm %ld source %d tag %ld\n", early_data_handle, (long int)early_data_handle->node_tag.node.comm,
|
|
|
|
- early_data_handle->node_tag.node.rank, early_data_handle->node_tag.data_tag);
|
|
|
|
|
|
+ _STARPU_MPI_DEBUG(60, "Adding early_data_handle %p with comm %ld source %d tag %ld (%p)\n", early_data_handle, (long int)early_data_handle->node_tag.node.comm, early_data_handle->node_tag.node.rank, early_data_handle->node_tag.data_tag, &early_data_handle->node_tag.node);
|
|
|
|
|
|
struct _starpu_mpi_early_data_handle_hashlist *hashlist;
|
|
struct _starpu_mpi_early_data_handle_hashlist *hashlist;
|
|
HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, &early_data_handle->node_tag.node, sizeof(struct _starpu_mpi_node), hashlist);
|
|
HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, &early_data_handle->node_tag.node, sizeof(struct _starpu_mpi_node), hashlist);
|