11/*
2- * Copyright (c) 2018 The University of Tennessee and The University
2+ * Copyright (c) 2018-2019 The University of Tennessee and The University
33 * of Tennessee Research Foundation. All rights
44 * reserved.
55 *
66 * Copyright (c) 2018 Cisco Systems, Inc. All rights reserved
77 * Copyright (c) 2018 Research Organization for Information Science
88 * and Technology (RIST). All rights reserved.
9+ * Copyright (c) 2019 Mellanox Technologies, Inc.
10+ * All rights reserved.
911 * $COPYRIGHT$
1012 *
1113 * Additional copyrights may follow
@@ -20,10 +22,8 @@ opal_timer_t sys_clock_freq_mhz = 0;
2022static void ompi_spc_dump (void );
2123
2224/* Array for converting from SPC indices to MPI_T indices */
23- OMPI_DECLSPEC int mpi_t_offset = -1 ;
24- OMPI_DECLSPEC bool mpi_t_enabled = false;
25-
26- OPAL_DECLSPEC ompi_communicator_t * comm = NULL ;
25+ static bool mpi_t_enabled = false;
26+ static ompi_communicator_t * ompi_spc_comm = NULL ;
2727
2828typedef struct ompi_spc_event_t {
2929 const char * counter_name ;
@@ -185,6 +185,8 @@ static int ompi_spc_notify(mca_base_pvar_t *pvar, mca_base_pvar_event_t event, v
185185 return MPI_SUCCESS ;
186186 }
187187
188+ index = (int )(uintptr_t )pvar -> ctx ; /* Convert from MPI_T pvar index to SPC index */
189+
188190 /* For this event, we need to set count to the number of long long type
189191 * values for this counter. All SPC counters are one long long, so we
190192 * always set count to 1.
@@ -194,14 +196,10 @@ static int ompi_spc_notify(mca_base_pvar_t *pvar, mca_base_pvar_event_t event, v
194196 }
195197 /* For this event, we need to turn on the counter */
196198 else if (MCA_BASE_PVAR_HANDLE_START == event ) {
197- /* Convert from MPI_T pvar index to SPC index */
198- index = pvar -> pvar_index - mpi_t_offset ;
199199 SET_SPC_BIT (ompi_spc_attached_event , index );
200200 }
201201 /* For this event, we need to turn off the counter */
202202 else if (MCA_BASE_PVAR_HANDLE_STOP == event ) {
203- /* Convert from MPI_T pvar index to SPC index */
204- index = pvar -> pvar_index - mpi_t_offset ;
205203 CLEAR_SPC_BIT (ompi_spc_attached_event , index );
206204 }
207205
@@ -231,7 +229,7 @@ static int ompi_spc_get_count(const struct mca_base_pvar_t *pvar, void *value, v
231229 }
232230
233231 /* Convert from MPI_T pvar index to SPC index */
234- int index = pvar -> pvar_index - mpi_t_offset ;
232+ int index = ( int )( uintptr_t ) pvar -> ctx ;
235233 /* Set the counter value to the current SPC value */
236234 * counter_value = (long long )ompi_spc_events [index ].value ;
237235 /* If this is a timer-based counter, convert from cycles to microseconds */
@@ -268,7 +266,7 @@ void ompi_spc_events_init(void)
268266 ompi_spc_events [i ].value = 0 ;
269267 }
270268
271- ompi_comm_dup (& ompi_mpi_comm_world .comm , & comm );
269+ ompi_comm_dup (& ompi_mpi_comm_world .comm , & ompi_spc_comm );
272270}
273271
274272/* Initializes the SPC data structures and registers all counters as MPI_T pvars.
@@ -287,14 +285,6 @@ void ompi_spc_init(void)
287285 char * * arg_strings = opal_argv_split (ompi_mpi_spc_attach_string , ',' );
288286 int num_args = opal_argv_count (arg_strings );
289287
290- /* Reset all timer-based counters */
291- for (i = 0 ; i < OMPI_SPC_NUM_COUNTERS ; i ++ ) {
292- CLEAR_SPC_BIT (ompi_spc_timer_event , i );
293- }
294-
295- /* If this is a timer event, set the corresponding timer_event entry */
296- SET_SPC_BIT (ompi_spc_timer_event , OMPI_SPC_MATCH_TIME );
297-
298288 /* If there is only one argument and it is 'all', then all counters
299289 * should be turned on. If the size is 0, then no counters will be enabled.
300290 */
@@ -304,47 +294,43 @@ void ompi_spc_init(void)
304294 }
305295 }
306296
307- /* Turn on only the counters that were specified in the MCA parameter */
308297 for (i = 0 ; i < OMPI_SPC_NUM_COUNTERS ; i ++ ) {
309- if (all_on ) {
310- found ++ ;
311- } else {
312- matched = 0 ;
313- /* Note: If no arguments were given, this will be skipped */
298+ /* Reset all timer-based counters */
299+ CLEAR_SPC_BIT (ompi_spc_timer_event , i );
300+ matched = all_on ;
301+
302+ if ( !matched ) {
303+ /* Turn on only the counters that were specified in the MCA parameter */
314304 for (j = 0 ; j < num_args ; j ++ ) {
315305 if ( 0 == strcmp (ompi_spc_events_names [i ].counter_name , arg_strings [j ]) ) {
316- found ++ ;
317306 matched = 1 ;
318307 break ;
319308 }
320309 }
321310 }
322311
323- if (all_on || matched ) {
312+ if (matched ) {
324313 SET_SPC_BIT (ompi_spc_attached_event , i );
325314 mpi_t_enabled = true;
315+ found ++ ;
316+ }
326317
327- /* Registers the current counter as an MPI_T pvar regardless of whether it's been turned on or not */
328- ret = mca_base_pvar_register ("ompi" , "runtime" , "spc" , ompi_spc_events_names [i ].counter_name , ompi_spc_events_names [i ].counter_description ,
329- OPAL_INFO_LVL_4 , MPI_T_PVAR_CLASS_SIZE ,
330- MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG , NULL , MPI_T_BIND_NO_OBJECT ,
331- MCA_BASE_PVAR_FLAG_READONLY | MCA_BASE_PVAR_FLAG_CONTINUOUS ,
332- ompi_spc_get_count , NULL , ompi_spc_notify , NULL );
333-
334- /* Check to make sure that ret is a valid index and not an error code */
335- if ( ret >= 0 ) {
336- if ( mpi_t_offset == -1 ) {
337- mpi_t_offset = ret ;
338- }
339- }
340- if ( (ret < 0 ) || (ret != (mpi_t_offset + found - 1 )) ) {
341- mpi_t_enabled = false;
342- opal_show_help ("help-mpi-runtime.txt" , "spc: MPI_T disabled" , true);
343- break ;
344- }
318+ /* Registers the current counter as an MPI_T pvar regardless of whether it's been turned on or not */
319+ ret = mca_base_pvar_register ("ompi" , "runtime" , "spc" , ompi_spc_events_names [i ].counter_name , ompi_spc_events_names [i ].counter_description ,
320+ OPAL_INFO_LVL_4 , MPI_T_PVAR_CLASS_SIZE ,
321+ MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG , NULL , MPI_T_BIND_NO_OBJECT ,
322+ MCA_BASE_PVAR_FLAG_READONLY | MCA_BASE_PVAR_FLAG_CONTINUOUS ,
323+ ompi_spc_get_count , NULL , ompi_spc_notify , (void * )(uintptr_t )i );
324+ if ( ret < 0 ) {
325+ mpi_t_enabled = false;
326+ opal_show_help ("help-mpi-runtime.txt" , "spc: MPI_T disabled" , true);
327+ break ;
345328 }
346329 }
347330
331+ /* If this is a timer event, set the corresponding timer_event entry */
332+ SET_SPC_BIT (ompi_spc_timer_event , OMPI_SPC_MATCH_TIME );
333+
348334 opal_argv_free (arg_strings );
349335}
350336
@@ -356,8 +342,8 @@ static void ompi_spc_dump(void)
356342 int i , j , world_size , offset ;
357343 long long * recv_buffer = NULL , * send_buffer ;
358344
359- int rank = ompi_comm_rank (comm );
360- world_size = ompi_comm_size (comm );
345+ int rank = ompi_comm_rank (ompi_spc_comm );
346+ world_size = ompi_comm_size (ompi_spc_comm );
361347
362348 /* Convert from cycles to usecs before sending */
363349 for (i = 0 ; i < OMPI_SPC_NUM_COUNTERS ; i ++ ) {
@@ -384,10 +370,10 @@ static void ompi_spc_dump(void)
384370 return ;
385371 }
386372 }
387- (void )comm -> c_coll -> coll_gather (send_buffer , OMPI_SPC_NUM_COUNTERS , MPI_LONG_LONG ,
373+ (void )ompi_spc_comm -> c_coll -> coll_gather (send_buffer , OMPI_SPC_NUM_COUNTERS , MPI_LONG_LONG ,
388374 recv_buffer , OMPI_SPC_NUM_COUNTERS , MPI_LONG_LONG ,
389- 0 , comm ,
390- comm -> c_coll -> coll_gather_module );
375+ 0 , ompi_spc_comm ,
376+ ompi_spc_comm -> c_coll -> coll_gather_module );
391377
392378 /* Once rank 0 has all of the information, print the aggregated counter values for each rank in order */
393379 if (rank == 0 ) {
@@ -413,7 +399,7 @@ static void ompi_spc_dump(void)
413399 }
414400 free (send_buffer );
415401
416- comm -> c_coll -> coll_barrier (comm , comm -> c_coll -> coll_barrier_module );
402+ ompi_spc_comm -> c_coll -> coll_barrier (ompi_spc_comm , ompi_spc_comm -> c_coll -> coll_barrier_module );
417403}
418404
419405/* Frees any dynamically alocated OMPI SPC data structures */
@@ -424,7 +410,7 @@ void ompi_spc_fini(void)
424410 }
425411
426412 free (ompi_spc_events ); ompi_spc_events = NULL ;
427- ompi_comm_free (& comm );
413+ ompi_comm_free (& ompi_spc_comm );
428414}
429415
430416/* Records an update to a counter using an atomic add operation. */
0 commit comments