/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*
*/
#ifndef MPIR_TAGS_H_INCLUDED
#define MPIR_TAGS_H_INCLUDED
/* Tags for point to point operations which implement collective and other
internal operations */
#define MPIR_BARRIER_TAG 1
#define MPIR_BCAST_TAG 2
#define MPIR_GATHER_TAG 3
#define MPIR_GATHERV_TAG 4
#define MPIR_SCATTER_TAG 5
#define MPIR_SCATTERV_TAG 6
#define MPIR_ALLGATHER_TAG 7
#define MPIR_ALLGATHERV_TAG 8
#define MPIR_ALLTOALL_TAG 9
#define MPIR_ALLTOALLV_TAG 10
#define MPIR_REDUCE_TAG 11
#define MPIR_USER_REDUCE_TAG 12
#define MPIR_USER_REDUCEA_TAG 13
#define MPIR_ALLREDUCE_TAG 14
#define MPIR_USER_ALLREDUCE_TAG 15
#define MPIR_USER_ALLREDUCEA_TAG 16
#define MPIR_REDUCE_SCATTER_TAG 17
#define MPIR_USER_REDUCE_SCATTER_TAG 18
#define MPIR_USER_REDUCE_SCATTERA_TAG 19
#define MPIR_SCAN_TAG 20
#define MPIR_USER_SCAN_TAG 21
#define MPIR_USER_SCANA_TAG 22
#define MPIR_LOCALCOPY_TAG 23
#define MPIR_EXSCAN_TAG 24
#define MPIR_ALLTOALLW_TAG 25
#define MPIR_TOPO_A_TAG 26
#define MPIR_TOPO_B_TAG 27
#define MPIR_REDUCE_SCATTER_BLOCK_TAG 28
#define MPIR_SHRINK_TAG 29
#define MPIR_AGREE_TAG 30
#define MPIR_FIRST_HCOLL_TAG 31
#define MPIR_LAST_HCOLL_TAG (MPIR_FIRST_HCOLL_TAG + 255)
#define MPIR_FIRST_NBC_TAG (MPIR_LAST_HCOLL_TAG + 1)
#define MPIR_TAG_BITS_DEFAULT (31)
/* These macros must be used carefully. These macros will not work with
* negative tags. By definition, users are not to use negative tags and the
* only negative tag in MPICH is MPI_ANY_TAG which is checked seperately, but
* if there is a time where negative tags become more common, this setup won't
* work anymore. */
/* MPID_TAG_BITS should be declared by device later */
#ifdef HAVE_TAG_ERROR_BITS
/* This bitmask can be used to manually mask the tag space wherever it might
* be necessary to do so (for instance in the receive queue */
#define MPIR_TAG_ERROR_BIT (1 << (MPIR_Process.tag_bits - 1))
/* This bitmask is used to differentiate between a process failure
* (MPIX_ERR_PROC_FAILED) and any other kind of failure (MPI_ERR_OTHER). */
#define MPIR_TAG_PROC_FAILURE_BIT (1 << (MPIR_Process.tag_bits - 2))
#define MPIR_TAG_ERROR_BITS (2)
#else
#define MPIR_TAG_ERROR_BITS (0)
#endif
/* This bitmask is used to differentiate between collective operations
with user-supplied tags and internally-defined tags. */
#define MPIR_TAG_COLL_BIT (1 << (MPIR_Process.tag_bits - MPIR_TAG_ERROR_BITS - 1))
/* This macro checks the value of the error bit in the MPI tag and returns 1
* if the tag is set and 0 if it is not. */
#ifdef HAVE_TAG_ERROR_BITS
#define MPIR_TAG_CHECK_ERROR_BIT(tag) ((MPIR_TAG_ERROR_BIT & (tag)) == MPIR_TAG_ERROR_BIT ? 1 : 0)
#else
#define MPIR_TAG_CHECK_ERROR_BIT(tag) 0
#endif
/* This macro checks the value of the process failure bit in the MPI tag and
* returns 1 if the tag is set and 0 if it is not. */
#ifdef HAVE_TAG_ERROR_BITS
#define MPIR_TAG_CHECK_PROC_FAILURE_BIT(tag) ((MPIR_TAG_PROC_FAILURE_BIT & (tag)) == MPIR_TAG_PROC_FAILURE_BIT ? 1 : 0)
#else
#define MPIR_TAG_CHECK_PROC_FAILURE_BIT(tag) 0
#endif
/* This macro sets the value of the error bit in the MPI tag to 1 */
#ifdef HAVE_TAG_ERROR_BITS
#define MPIR_TAG_SET_ERROR_BIT(tag) ((tag) |= MPIR_TAG_ERROR_BIT)
#else
#define MPIR_TAG_SET_ERROR_BIT(tag) (tag)
#endif
/* This macro sets the value of the process failure bit in the MPI tag to 1 */
#ifdef HAVE_TAG_ERROR_BITS
#define MPIR_TAG_SET_PROC_FAILURE_BIT(tag) ((tag) |= (MPIR_TAG_ERROR_BIT | MPIR_TAG_PROC_FAILURE_BIT))
#else
#define MPIR_TAG_SET_PROC_FAILURE_BIT(tag) (tag)
#endif
/* This macro clears the value of the error bits in the MPI tag */
#ifdef HAVE_TAG_ERROR_BITS
#define MPIR_TAG_CLEAR_ERROR_BITS(tag) ((tag) &= ~(MPIR_TAG_ERROR_BIT ^ MPIR_TAG_PROC_FAILURE_BIT))
#else
#define MPIR_TAG_CLEAR_ERROR_BITS(tag) (tag)
#endif
/* This macro masks the value of the error bits in the MPI tag */
#ifdef HAVE_TAG_ERROR_BITS
#define MPIR_TAG_MASK_ERROR_BITS(tag) ((tag) & ~(MPIR_TAG_ERROR_BIT ^ MPIR_TAG_PROC_FAILURE_BIT))
#else
#define MPIR_TAG_MASK_ERROR_BITS(tag) (tag)
#endif
/* This macro defines tag bits available for user tags */
#define MPIR_TAG_USABLE_BITS ((1 << (MPIR_Process.tag_bits - MPIR_TAG_ERROR_BITS - 1)) - 1)
#endif /* MPIR_TAGS_H_INCLUDED */