in prov/bgq/include/rdma/bgq/fi_bgq_mu.h [566:678]
uint32_t fi_bgq_mu_calculate_fifo_map(BG_CoordinateMapping_t local,
BG_CoordinateMapping_t remote, Personality_t * personality,
uint64_t dcr_value) {
/* calculate the signed coordinate difference between the source and
* destination torus coordinates
*/
ssize_t dA = (ssize_t)remote.a - (ssize_t)local.a;
ssize_t dB = (ssize_t)remote.b - (ssize_t)local.b;
ssize_t dC = (ssize_t)remote.c - (ssize_t)local.c;
ssize_t dD = (ssize_t)remote.d - (ssize_t)local.d;
ssize_t dE = (ssize_t)remote.e - (ssize_t)local.e;
/* select the fifo based on the t coordinate only if local */
if ((dA | dB | dC | dD | dE) == 0) {
return (remote.t & 0x01) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL0 : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL1;
}
/* select either A- or A+ if communicating only along the A dimension */
if ((dB | dC | dD | dE) == 0) {
if (ND_ENABLE_TORUS_DIM_A & personality->Network_Config.NetFlags) {
uint64_t cutoff;
if (dA > 0) {
cutoff = ND_500_DCR__CTRL_CUTOFFS__A_PLUS_get(dcr_value);
return (remote.a > cutoff) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP;
} else {
cutoff = ND_500_DCR__CTRL_CUTOFFS__A_MINUS_get(dcr_value);
return (remote.a < cutoff) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM;
}
} else {
return (dA > 0) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM;
}
}
/* select either B- or B+ if communicating only along the B dimension */
if ((dA | dC | dD | dE) == 0) {
if (ND_ENABLE_TORUS_DIM_B & personality->Network_Config.NetFlags) {
uint64_t cutoff;
if (dB > 0) {
cutoff = ND_500_DCR__CTRL_CUTOFFS__B_PLUS_get(dcr_value);
return (remote.b > cutoff) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP;
} else {
cutoff = ND_500_DCR__CTRL_CUTOFFS__B_MINUS_get(dcr_value);
return (remote.b < cutoff) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM;
}
} else {
return (dB > 0) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM;
}
}
/* select either C- or C+ if communicating only along the C dimension */
if ((dA | dB | dD | dE) == 0) {
if (ND_ENABLE_TORUS_DIM_C & personality->Network_Config.NetFlags) {
uint64_t cutoff;
if (dC > 0) {
cutoff = ND_500_DCR__CTRL_CUTOFFS__C_PLUS_get(dcr_value);
return (remote.c > cutoff) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP;
} else {
cutoff = ND_500_DCR__CTRL_CUTOFFS__C_MINUS_get(dcr_value);
return (remote.c < cutoff) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM;
}
} else {
return (dC > 0) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM;
}
}
/* select either D- or D+ if communicating only along the D dimension */
if ((dA | dB | dC | dE) == 0) {
if (ND_ENABLE_TORUS_DIM_D & personality->Network_Config.NetFlags) {
uint64_t cutoff;
if (dD > 0) {
cutoff = ND_500_DCR__CTRL_CUTOFFS__D_PLUS_get(dcr_value);
return (remote.d > cutoff) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP;
} else {
cutoff = ND_500_DCR__CTRL_CUTOFFS__D_MINUS_get(dcr_value);
return (remote.d < cutoff) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM;
}
} else {
return (dD > 0) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM;
}
}
/* select either E- or E+ if communicating only along the E dimension */
if ((dA | dB | dC | dD) == 0) {
/* the maximum 'e' dimension size is 2 - and is a torus */
return (remote.t & 0x01) ? MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EP : MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EM;
}
/* communicating along diagonal */
/* TODO - OPTIMIZE - round-robin the fifo picking based on destination */
if (dA > 0) {
return MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP;
} else if (dA < 0)
return MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM;
if (dB > 0) {
return MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP;
} else if (dB < 0)
return MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM;
if (dC > 0) {
return MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP;
} else if (dC < 0)
return MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM;
if (dD > 0) {
return MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP;
} else if(dD < 0)
return MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM;
assert(0);
return 0xFFFFu;
}