codes-mapping-context.c 4.79 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*
 * Copyright (C) 2015 University of Chicago.
 * See COPYRIGHT notice in top-level directory.
 *
 */

#include <codes/codes-mapping-context.h>
#include <codes/codes_mapping.h>

10
static struct codes_mctx const CODES_MCTX_DEFAULT_VAL = {
Jonathan Jenkins's avatar
Jonathan Jenkins committed
11 12 13 14
    .type = CODES_MCTX_GROUP_MODULO,
    .u = {
        .group_modulo = {
            .anno = {
15
                .cid = -1,
Jonathan Jenkins's avatar
Jonathan Jenkins committed
16 17 18 19 20
            }
        }
    }
};

21 22
struct codes_mctx const * const CODES_MCTX_DEFAULT = &CODES_MCTX_DEFAULT_VAL;

23 24 25 26 27 28 29 30 31 32 33 34 35
struct codes_mctx codes_mctx_set_global_direct(tw_lpid lpid)
{
    struct codes_mctx rtn;
    rtn.type = CODES_MCTX_GLOBAL_DIRECT;
    rtn.u.global_direct.lpid = lpid;
    return rtn;
}
struct codes_mctx codes_mctx_set_group_modulo(
        char const * annotation,
        bool ignore_annotations)
{
    struct codes_mctx rtn;
    rtn.type = CODES_MCTX_GROUP_MODULO;
36 37 38 39 40
    if (ignore_annotations)
        rtn.u.group_modulo.anno.cid = -1;
    else
        rtn.u.group_modulo.anno.cid =
            codes_mapping_get_anno_cid_by_name(annotation);
41 42 43 44 45 46 47 48 49 50
    return rtn;
}
struct codes_mctx codes_mctx_set_group_direct(
        int offset,
        char const * annotation,
        bool ignore_annotations)
{
    struct codes_mctx rtn;
    rtn.type = CODES_MCTX_GROUP_DIRECT;
    rtn.u.group_direct.offset = offset;
51 52 53 54 55
    if (ignore_annotations)
        rtn.u.group_direct.anno.cid = -1;
    else
        rtn.u.group_direct.anno.cid =
            codes_mapping_get_anno_cid_by_name(annotation);
56 57 58 59 60 61 62 63
    return rtn;
}

/* helper function to do a codes mapping - this function is subject to change
 * based on what types of ctx exist */
tw_lpid codes_mctx_to_lpid(
        struct codes_mctx const * ctx,
        char const * dest_lp_name,
64
        tw_lpid sender_gid)
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
{
    struct codes_mctx_annotation const *anno;
    // short circuit for direct mappings
    switch (ctx->type) {
        case CODES_MCTX_GLOBAL_DIRECT:
            return ctx->u.global_direct.lpid;
        case CODES_MCTX_GROUP_MODULO:
            anno = &ctx->u.group_modulo.anno;
            break;
        case CODES_MCTX_GROUP_DIRECT:
            anno = &ctx->u.group_direct.anno;
            break;
        default:
            assert(0);
    }

    char sender_group[MAX_NAME_LENGTH];
    int unused, rep_id, offset;

    // get sender info
85
    codes_mapping_get_lp_info(sender_gid, sender_group, &unused, NULL, &unused,
86 87
            NULL, &rep_id, &offset);

88 89 90 91 92 93
    char const * anno_str;
    if (anno->cid < 0)
        anno_str = NULL;
    else
        anno_str = codes_mapping_get_anno_name_by_cid(anno->cid);

94 95 96
    int dest_offset;
    if (ctx->type == CODES_MCTX_GROUP_MODULO) {
        int num_dest_lps = codes_mapping_get_lp_count(sender_group, 1,
97
                dest_lp_name, anno_str, anno->cid == -1);
98 99 100 101
        if (num_dest_lps == 0)
            tw_error(TW_LOC,
                    "ERROR: Found no LPs of type %s in group %s "
                    "(source lpid %lu) with annotation: %s\n",
102
                    dest_lp_name, sender_group, sender_gid,
103 104
                    anno->cid == -1 ? "ignored" :
                    codes_mapping_get_anno_name_by_cid(anno->cid));
105 106 107 108 109 110 111 112 113 114

        dest_offset = offset % num_dest_lps;
    }
    else if (ctx->type == CODES_MCTX_GROUP_DIRECT) {
        dest_offset = ctx->u.group_direct.offset;
    }
    else
        assert(0);

    tw_lpid rtn;
115 116
    codes_mapping_get_lp_id(sender_group, dest_lp_name, anno_str,
            anno->cid == -1, rep_id, dest_offset, &rtn);
117 118 119
    return rtn;
}

120 121 122 123 124 125 126 127 128 129 130
char const * codes_mctx_get_annotation(
        struct codes_mctx const *ctx,
        char const * dest_lp_name,
        tw_lpid sender_id)
{
    switch(ctx->type) {
        case CODES_MCTX_GLOBAL_DIRECT:
            return codes_mapping_get_annotation_by_lpid(sender_id);
        case CODES_MCTX_GROUP_MODULO:
            // if not ignoring the annotation, just return what's in the
            // context
131 132 133
            if (ctx->u.group_modulo.anno.cid >= 0)
                return codes_mapping_get_anno_name_by_cid(
                        ctx->u.group_modulo.anno.cid);
134 135
            break;
        case CODES_MCTX_GROUP_DIRECT:
136 137 138
            if (ctx->u.group_direct.anno.cid >= 0)
                return codes_mapping_get_anno_name_by_cid(
                        ctx->u.group_direct.anno.cid);
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
            break;
        default:
            tw_error(TW_LOC, "unrecognized or uninitialized context type: %d",
                    ctx->type);
            return NULL;
    }
    // at this point, we must be a group-wise mapping ignoring annotations

    char group[MAX_NAME_LENGTH];
    int dummy;
    // only need the group name
    codes_mapping_get_lp_info(sender_id, group, &dummy, NULL, &dummy, NULL,
            &dummy, &dummy);

    return codes_mapping_get_annotation_by_name(group, dest_lp_name);
}

156 157 158 159 160 161 162 163 164
/*
 * Local variables:
 *  c-indent-level: 4
 *  c-basic-offset: 4
 *  indent-tabs-mode: nil
 * End:
 *
 * vim: ts=8 sts=4 sw=4 expandtab
 */