Hi, Proposed small patch to extend current rankfile syntax to be compliant with orte_hosts syntax making it possible to claim relative hosts from the hostfile/scheduler by using +n# hostname, where 0 <= # < np ex: cat ~/work/svn/hpc/dev/test/Rankfile/rankfile rank 0=+n0 slot=0 rank 1=+n0 slot=1 rank 2=+n1 slot=2 rank 3=+n1 slot=1 for your review and blessing before I commit it to the trunk. I also ask to add it to 1.3 branch. thanks, Lenny.
Index: orte/mca/rmaps/rank_file/help-rmaps_rank_file.txt
===================================================================
--- orte/mca/rmaps/rank_file/help-rmaps_rank_file.txt (revision 21529)
+++ orte/mca/rmaps/rank_file/help-rmaps_rank_file.txt (working copy)
@@ -56,6 +56,9 @@
Please review your rank-slot assignments and your host allocation to ensure
a proper match.
+[bad-index]
+Rankfile claimed host %s by index that is bigger than number of allocated
hosts.
+
[orte-rmaps-rf:alloc-error]
There are not enough slots available in the system to satisfy the %d slots
that were requested by the application:
Index: orte/mca/rmaps/rank_file/rmaps_rank_file_lex.h
===================================================================
--- orte/mca/rmaps/rank_file/rmaps_rank_file_lex.h (revision 21529)
+++ orte/mca/rmaps/rank_file/rmaps_rank_file_lex.h (working copy)
@@ -75,6 +75,7 @@
#define ORTE_RANKFILE_NEWLINE 13
#define ORTE_RANKFILE_IPV6 14
#define ORTE_RANKFILE_SLOT 15
+#define ORTE_RANKFILE_RELATIVE 16
#if defined(c_plusplus) || defined(__cplusplus)
}
Index: orte/mca/rmaps/rank_file/rmaps_rank_file.c
===================================================================
--- orte/mca/rmaps/rank_file/rmaps_rank_file.c (revision 21529)
+++ orte/mca/rmaps/rank_file/rmaps_rank_file.c (working copy)
@@ -273,11 +273,11 @@
orte_vpid_t total_procs;
opal_list_t node_list;
opal_list_item_t *item;
- orte_node_t *node, *nd;
+ orte_node_t *node, *nd, *root_node;
orte_vpid_t rank, vpid_start;
orte_std_cntr_t num_nodes, num_slots;
orte_rmaps_rank_file_map_t *rfmap;
- orte_std_cntr_t slots_per_node;
+ orte_std_cntr_t slots_per_node, relative_index, tmp_cnt;
int rc;
/* convenience def */
@@ -411,7 +411,25 @@
0 == strcmp(nd->name, rfmap->node_name)) {
node = nd;
break;
- }
+ } else if (NULL != rfmap->node_name &&
+ (('+' == rfmap->node_name[0]) &&
+ (('n' == rfmap->node_name[1]) ||
+ ('N' == rfmap->node_name[1])))) {
+
+ relative_index=atoi(strtok(rfmap->node_name,"+n"));
+ if ( relative_index >= opal_list_get_size (&node_list) || ( 0 >
relative_index)){
+ orte_show_help("help-rmaps_rank_file.txt","bad-index",
true,rfmap->node_name);
+ ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM);
+ return ORTE_ERR_BAD_PARAM;
+ }
+ root_node = (orte_node_t*) opal_list_get_first(&node_list);
+ for(tmp_cnt=0; tmp_cnt<relative_index; tmp_cnt++) {
+ root_node = (orte_node_t*) opal_list_get_next(root_node);
+ }
+ node = root_node;
+ break;
+ }
+
}
if (NULL == node) {
orte_show_help("help-rmaps_rank_file.txt","bad-host", true,
rfmap->node_name);
@@ -631,6 +649,7 @@
case ORTE_RANKFILE_IPV6:
case ORTE_RANKFILE_STRING:
case ORTE_RANKFILE_INT:
+ case ORTE_RANKFILE_RELATIVE:
if(ORTE_RANKFILE_INT == token) {
sprintf(buff,"%d", orte_rmaps_rank_file_value.ival);
value = buff;
Index: orte/mca/rmaps/rank_file/rmaps_rank_file_lex.l
===================================================================
--- orte/mca/rmaps/rank_file/rmaps_rank_file_lex.l (revision 21529)
+++ orte/mca/rmaps/rank_file/rmaps_rank_file_lex.l (working copy)
@@ -111,6 +111,9 @@
orte_rmaps_rank_file_value.sval = yytext;
return ORTE_RANKFILE_HOSTNAME; }
+\+n[0-9]+ { orte_rmaps_rank_file_value.sval = yytext;
+ return ORTE_RANKFILE_RELATIVE; }
+
. { orte_rmaps_rank_file_value.sval = yytext;
return ORTE_RANKFILE_ERROR; }
rankfile.patch
Description: Binary data
