static inline void create_dt_map() { int i, j; size_t dtsize[FI_DATATYPE_LAST]; dtsize[FI_INT8] = sizeof(int8_t); dtsize[FI_UINT8] = sizeof(uint8_t); dtsize[FI_INT16] = sizeof(int16_t); dtsize[FI_UINT16] = sizeof(uint16_t); dtsize[FI_INT32] = sizeof(int32_t); dtsize[FI_UINT32] = sizeof(uint32_t); dtsize[FI_INT64] = sizeof(int64_t); dtsize[FI_UINT64] = sizeof(uint64_t); dtsize[FI_FLOAT] = sizeof(float); dtsize[FI_DOUBLE] = sizeof(double); dtsize[FI_FLOAT_COMPLEX] = sizeof(float complex); dtsize[FI_DOUBLE_COMPLEX] = sizeof(double complex); dtsize[FI_LONG_DOUBLE] = sizeof(long double); dtsize[FI_LONG_DOUBLE_COMPLEX] = sizeof(long double complex); /* when atomics are disabled and atomics capability are not * enabled call fo fi_atomic*** may crash */ MPIR_Assert(MPIDI_OFI_ENABLE_ATOMICS); for (i = 0; i < MPIDI_OFI_DT_SIZES; i++) for (j = 0; j < MPIDI_OFI_OP_SIZES; j++) { enum fi_datatype fi_dt = (enum fi_datatype) -1; enum fi_op fi_op = (enum fi_op) -1; mpi_to_ofi(mpi_dtypes[i], &fi_dt, mpi_ops[j], &fi_op); MPIR_Assert(fi_dt != (enum fi_datatype) -1); MPIR_Assert(fi_op != (enum fi_op) -1); _TBL.dt = fi_dt; _TBL.op = fi_op; _TBL.atomic_valid = 0; _TBL.max_atomic_count = 0; _TBL.max_fetch_atomic_count = 0; _TBL.max_compare_atomic_count = 0; _TBL.mpi_acc_valid = check_mpi_acc_valid(mpi_dtypes[i], mpi_ops[j]); ssize_t ret; size_t atomic_count; if (fi_dt != FI_DATATYPE_LAST && fi_op != FI_ATOMIC_OP_LAST) { CHECK_ATOMIC(fi_atomicvalid, atomic_valid, max_atomic_count); CHECK_ATOMIC(fi_fetch_atomicvalid, fetch_atomic_valid, max_fetch_atomic_count); CHECK_ATOMIC(fi_compare_atomicvalid, compare_atomic_valid, max_compare_atomic_count); _TBL.dtsize = dtsize[fi_dt]; } } }
inline atomic_rep* tree::operator -> () { CHECK_ATOMIC (*this); return static_cast<atomic_rep*> (rep); }