28
28
#include "ompi/mca/mca.h"
29
29
#include "coll_tuned.h"
30
30
#include "ompi/mca/coll/base/coll_base_functions.h"
31
+ #include "opal/util/json/opal_json.h"
32
+
31
33
32
34
/* need to include our own topo prototypes so we can malloc data on the comm correctly */
33
35
#include "ompi/mca/coll/base/coll_base_topo.h"
@@ -46,6 +48,88 @@ static int fileline=0; /* used for verbose error messages */
46
48
#define getnext (fptr , pval ) ompi_coll_base_file_getnext_long(fptr, &fileline, pval)
47
49
#define isnext_digit (fptr ) ompi_coll_base_file_peek_next_char_isdigit(fptr)
48
50
51
+ static int ompi_coll_tuned_name_to_coll_id ( const char * coll_name , int * coll_id ) {
52
+ // TODO: implement me.
53
+ * coll_id = 1 ;
54
+ return 0 ;
55
+ }
56
+
57
+
58
+ static int ompi_coll_tuned_read_rules_json (const opal_json_t * json_root , ompi_coll_alg_rule_t * * rules ) {
59
+
60
+ int rc = OPAL_ERROR ;
61
+
62
+ /* complete table of rules */
63
+ ompi_coll_alg_rule_t * alg_rules = (ompi_coll_alg_rule_t * ) NULL ;
64
+
65
+ /* individual pointers to sections of rules */
66
+ ompi_coll_alg_rule_t * alg_p = (ompi_coll_alg_rule_t * ) NULL ;
67
+ ompi_coll_com_rule_t * com_p = (ompi_coll_com_rule_t * ) NULL ;
68
+ ompi_coll_msg_rule_t * msg_p = (ompi_coll_msg_rule_t * ) NULL ;
69
+
70
+
71
+ alg_rules = ompi_coll_tuned_mk_alg_rules (COLLCOUNT );
72
+
73
+ const opal_json_t * collectives_obj ;
74
+ size_t num_collectives = 0 ;
75
+ size_t num_comm_rules ;
76
+ rc = opal_json_get_key (json_root , "collectives" , & collectives_obj );
77
+ // TODO err
78
+
79
+ rc = opal_json_get_container_size (collectives_obj , & num_collectives );
80
+ // TODO err
81
+
82
+ for ( size_t jcol = 0 ; jcol < num_collectives ; jcol ++ ) {
83
+ const opal_json_t * comm_rule_array ;
84
+ const char * coll_name ;
85
+ int coll_id ;
86
+ rc = opal_json_get_key_by_index ( collectives_obj , jcol , & coll_name , & comm_rule_array );
87
+ // TODO: err
88
+ rc = ompi_coll_tuned_name_to_coll_id ( coll_name , & coll_id );
89
+ // TODO: err
90
+
91
+ alg_p = & alg_rules [coll_id ];
92
+ alg_p -> alg_rule_id = coll_id ;
93
+ rc = opal_json_get_container_size (comm_rule_array , & num_comm_rules );
94
+ // TODO: err
95
+ alg_p -> n_com_sizes = (int )num_comm_rules ;
96
+ alg_p -> com_rules = ompi_coll_tuned_mk_com_rules (num_comm_rules , coll_id );
97
+
98
+ for (size_t jcomm_rule = 0 ; jcomm_rule < num_comm_rules ; jcomm_rule ++ ) {
99
+ const opal_json_t * comm_rule ;
100
+ const opal_json_t * msg_size_array ;
101
+ size_t num_msg_rules ;
102
+ int64_t comm_size ;
103
+ rc = opal_json_get_index (comm_rule_array , jcomm_rule , & comm_rule );
104
+ com_p = & (alg_p -> com_rules [jcomm_rule ]);
105
+ rc = opal_json_read_integer ("comm_size" , & comm_size );
106
+ rc = opal_json_get_key ( comm_rule , "rules" , & msg_size_array );
107
+ rc = opal_json_get_container_size (msg_size_array , & num_msg_rules );
108
+
109
+ for (size_t jmsg_rule = 0 ; jmsg_rule < num_msg_rules ; jmsg_rule ++ ) {
110
+ /* { "bytes" : 0, "alg" : 0, "reqs" : 20 } */
111
+ const opal_json_t * msg_rule ;
112
+ rc = opal_json_get_index (msg_size_array , jmsg_rule , & msg_rule );
113
+ msg_p = & (com_p -> msg_rules [jmsg_rule ]);
114
+ int64_t msg_size , faninout ;
115
+ opal_json_read_integer (msg_rule , & msg_size );
116
+ /* allow arg by string? */
117
+ msg_p -> msg_size = (size_t )msg_size ;
118
+
119
+ opal_json_free (& msg_rule );
120
+ }
121
+
122
+ opal_json_free (& msg_size_array );
123
+ opal_json_free (& comm_rule );
124
+ }
125
+
126
+ opal_json_free (& comm_rule_array );
127
+ }
128
+
129
+ // TODO free collectives_obj
130
+ return rc ;
131
+ }
132
+
49
133
/*
50
134
* Reads a rule file called fname
51
135
* The rule file defines a set of sets of rules. The outer set is keyed on
@@ -68,7 +152,7 @@ static int fileline=0; /* used for verbose error messages */
68
152
*
69
153
*/
70
154
71
- int ompi_coll_tuned_read_rules_config_file (char * fname , ompi_coll_alg_rule_t * * rules )
155
+ static int ompi_coll_tuned_read_rules_config_file_classic (char * fname , ompi_coll_alg_rule_t * * rules )
72
156
{
73
157
long NCOL = 0 , /* number of collectives for which rules are provided */
74
158
COLID = 0 , /* identifies the collective type to associate the rules with */
@@ -301,3 +385,29 @@ int ompi_coll_tuned_read_rules_config_file (char *fname, ompi_coll_alg_rule_t**
301
385
return (-1 );
302
386
}
303
387
388
+ int ompi_coll_tuned_read_rules_config_file (char * fname , ompi_coll_alg_rule_t * * rules ) {
389
+ if (!fname ) {
390
+ OPAL_OUTPUT ((ompi_coll_tuned_stream ,"Gave NULL as rule table configuration file for tuned collectives... ignoring!\n" ));
391
+ return (-1 );
392
+ }
393
+
394
+ if (!rules ) {
395
+ OPAL_OUTPUT ((ompi_coll_tuned_stream ,"Gave NULL as rule table result ptr!... ignoring!\n" ));
396
+ return (-2 );
397
+ }
398
+
399
+ const opal_json_t * json ;
400
+ int ret = opal_json_load_file (fname , & json );
401
+ if (ret == OPAL_SUCCESS ) {
402
+ ret = ompi_coll_tuned_read_rules_json (json , rules );
403
+ opal_json_free (& json );
404
+ return ret ;
405
+ } else {
406
+ opal_output_verbose (20 , ompi_coll_tuned_stream , "Failed to parse %s as valid json. Assuming classic format.\n" ,fname );
407
+ ret = ompi_coll_tuned_read_rules_config_file_classic (fname , rules );
408
+ if (ret != OPAL_SUCCESS ) {
409
+ opal_output_verbose (1 , ompi_coll_tuned_stream , "Failed to load %s in either json or classic readers. Check format.\n" ,fname );
410
+ }
411
+ return ret ;
412
+ }
413
+ }
0 commit comments