The intent of this change is to remove edge nodes (by "not counting
them).

The point of this heuristic is to deal with the case of small
lattices which can easily have more surface than interior,
which leads to choosing a non representative seed. This causes
impossible counts to get reported.

Signed-off-by: Robert Pearson <rpear...@systemfabricworks.com>
Signed-off-by: Hal Rosenstock <hal.rosenst...@gmail.com>
---
Changes since v2:
In make_geometry, added comment on meaning of magic number 4
In seed_axes, made log level DEBUG and placed in osm_log_is_active clause

Changes since v1:
Replaced printfs with OSM_LOG calls

diff --git a/opensm/opensm/osm_mesh.c b/opensm/opensm/osm_mesh.c
index 72a9aa9..260e2f8 100644
--- a/opensm/opensm/osm_mesh.c
+++ b/opensm/opensm/osm_mesh.c
@@ -170,6 +170,11 @@ static const struct mesh_info {
 
        {8, {2, 2, 2, 2, 2, 2, 2, 2},   8, {-1792, -6144, -8960, -7168, -3360, 
-896, -112, 0, 1},       },
 
+       /*
+        * mesh errors
+        */
+       {2, {6, 6},                     4, {-192, -256, -80, 0, 1}, },
+
        {-1, {0,}, 0, {0, },                                    },
 };
 
@@ -727,6 +732,42 @@ done:
 }
 
 /*
+ * remove_edges
+ *
+ * remove type from nodes that have fewer links
+ * than adjacent nodes
+ */
+static void remove_edges(lash_t *p_lash)
+{
+       osm_log_t *p_log = &p_lash->p_osm->log;
+       int sw;
+       mesh_node_t *n, *nn;
+       int i;
+
+       OSM_LOG_ENTER(p_log);
+
+       for (sw = 0; sw < p_lash->num_switches; sw++) {
+               n = p_lash->switches[sw]->node;
+               if (!n->type)
+                       continue;
+
+               for (i = 0; i < n->num_links; i++) {
+                       nn = p_lash->switches[n->links[i]->switch_id]->node;
+
+                       if (nn->num_links > n->num_links) {
+                               OSM_LOG(p_log, OSM_LOG_DEBUG,
+                                       "removed edge switch %s\n",
+                                       
p_lash->switches[sw]->p_sw->p_node->print_desc);
+                               n->type = -1;
+                               break;
+                       }
+               }
+       }
+
+       OSM_LOG_EXIT(p_log);
+}
+
+/*
  * get_local_geometry
  *
  * analyze the local geometry around each switch
@@ -735,6 +776,7 @@ static int get_local_geometry(lash_t *p_lash, mesh_t *mesh)
 {
        osm_log_t *p_log = &p_lash->p_osm->log;
        int sw;
+       int status = 0;
 
        OSM_LOG_ENTER(p_log);
 
@@ -747,15 +789,38 @@ static int get_local_geometry(lash_t *p_lash, mesh_t 
*mesh)
                        continue;
 
                if (get_switch_metric(p_lash, sw)) {
-                       OSM_LOG_EXIT(p_log);
-                       return -1;
+                       status = -1;
+                       goto Exit;
                }
-               classify_switch(p_lash, mesh, sw);
                classify_mesh_type(p_lash, sw);
        }
 
+       remove_edges(p_lash);
+
+       for (sw = 0; sw < p_lash->num_switches; sw++) {
+               if (p_lash->switches[sw]->node->type < 0)
+                       continue;
+               classify_switch(p_lash, mesh, sw);
+       }
+
+Exit:
        OSM_LOG_EXIT(p_log);
-       return 0;
+       return status;
+}
+
+static void print_axis(lash_t *p_lash, char *p, int sw, int port)
+{
+       mesh_node_t *node = p_lash->switches[sw]->node;
+       char *name = p_lash->switches[sw]->p_sw->p_node->print_desc;
+       int c = node->axes[port];
+
+       p += sprintf(p, "%s[%d] = ", name, port);
+       if (c)
+               p += sprintf(p, "%s%c -> ", ((c - 1) & 1) ? "-" : "+", 'X' + (c 
- 1)/2);
+       else
+               p += sprintf(p, "N/A -> ");
+       p += sprintf(p, "%s\n",
+                    
p_lash->switches[node->links[port]->switch_id]->p_sw->p_node->print_desc);
 }
 
 /*
@@ -775,6 +840,7 @@ static void seed_axes(lash_t *p_lash, int sw)
        int i, j, c;
 
        OSM_LOG_ENTER(p_log);
+
        if (!node->matrix || !node->dimension)
                goto done;
 
@@ -805,6 +871,16 @@ static void seed_axes(lash_t *p_lash, int sw)
                }
        }
 
+       if (osm_log_is_active(p_log, OSM_LOG_DEBUG)) {
+               char buf[256], *p;
+
+               for (i = 0; i < n; i++) {
+                       p = buf;
+                       print_axis(p_lash, p, sw, i);
+                       OSM_LOG(p_log, OSM_LOG_DEBUG, "%s", buf);
+               }
+       }
+
 done:
        OSM_LOG_EXIT(p_log);
 }
@@ -878,6 +954,12 @@ static void make_geometry(lash_t *p_lash, int sw)
                        n = s1->node->num_links;
 
                        /*
+                        * ignore chain fragments
+                        */
+                       if (n < seed->node->num_links && n <= 2)
+                               continue;
+
+                       /*
                         * only process 'mesh' switches
                         */
                        if (!s1->node->matrix)
@@ -908,7 +990,9 @@ static void make_geometry(lash_t *p_lash, int sw)
                                        if (j == i)
                                                continue;
 
-                                       if (s1->node->matrix[i][j] != 2) {
+                                       /* Rule out opposite nodes when 
distance greater than 4 */
+                                       if (s1->node->matrix[i][j] != 2 &&
+                                           s1->node->matrix[i][j] <= 4) {
                                                if (s1->node->axes[j]) {
                                                        if (s1->node->axes[j] 
!= opposite(seed, s1->node->axes[i])) {
                                                                OSM_LOG(p_log, 
OSM_LOG_DEBUG, "phase 1 mismatch\n");
_______________________________________________
general mailing list
general@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to