xref: /petsc/src/sys/perfstubs/tool.h (revision e8e8640d1cb9a3a2f50c0c0d7b26e5c4d521e2e4)
1*a0c7f9aaSSamuel Khuvis // Copyright (c) 2019 University of Oregon
2*a0c7f9aaSSamuel Khuvis // Distributed under the BSD Software License
3*a0c7f9aaSSamuel Khuvis // (See accompanying file LICENSE.txt)
4*a0c7f9aaSSamuel Khuvis 
5*a0c7f9aaSSamuel Khuvis #pragma once
6*a0c7f9aaSSamuel Khuvis #include <stdint.h>
7*a0c7f9aaSSamuel Khuvis 
8*a0c7f9aaSSamuel Khuvis /****************************************************************************/
9*a0c7f9aaSSamuel Khuvis /* Declare the structures that a tool should use to return performance data. */
10*a0c7f9aaSSamuel Khuvis /****************************************************************************/
11*a0c7f9aaSSamuel Khuvis 
12*a0c7f9aaSSamuel Khuvis typedef struct ps_tool_timer_data
13*a0c7f9aaSSamuel Khuvis {
14*a0c7f9aaSSamuel Khuvis     unsigned int num_timers;
15*a0c7f9aaSSamuel Khuvis     unsigned int num_threads;
16*a0c7f9aaSSamuel Khuvis     unsigned int num_metrics;
17*a0c7f9aaSSamuel Khuvis     char **timer_names;
18*a0c7f9aaSSamuel Khuvis     char **metric_names;
19*a0c7f9aaSSamuel Khuvis     double *values;
20*a0c7f9aaSSamuel Khuvis } ps_tool_timer_data_t;
21*a0c7f9aaSSamuel Khuvis 
22*a0c7f9aaSSamuel Khuvis typedef struct ps_tool_counter_data
23*a0c7f9aaSSamuel Khuvis {
24*a0c7f9aaSSamuel Khuvis     unsigned int num_counters;
25*a0c7f9aaSSamuel Khuvis     unsigned int num_threads;
26*a0c7f9aaSSamuel Khuvis     char **counter_names;
27*a0c7f9aaSSamuel Khuvis     double *num_samples;
28*a0c7f9aaSSamuel Khuvis     double *value_total;
29*a0c7f9aaSSamuel Khuvis     double *value_min;
30*a0c7f9aaSSamuel Khuvis     double *value_max;
31*a0c7f9aaSSamuel Khuvis     double *value_sumsqr;
32*a0c7f9aaSSamuel Khuvis } ps_tool_counter_data_t;
33*a0c7f9aaSSamuel Khuvis 
34*a0c7f9aaSSamuel Khuvis typedef struct ps_tool_metadata
35*a0c7f9aaSSamuel Khuvis {
36*a0c7f9aaSSamuel Khuvis     unsigned int num_values;
37*a0c7f9aaSSamuel Khuvis     char **names;
38*a0c7f9aaSSamuel Khuvis     char **values;
39*a0c7f9aaSSamuel Khuvis } ps_tool_metadata_t;
40*a0c7f9aaSSamuel Khuvis 
41*a0c7f9aaSSamuel Khuvis /****************************************************************************/
42*a0c7f9aaSSamuel Khuvis /* Declare the typedefs of the functions that a tool should implement. */
43*a0c7f9aaSSamuel Khuvis /****************************************************************************/
44*a0c7f9aaSSamuel Khuvis 
45*a0c7f9aaSSamuel Khuvis /* Logistical functions */
46*a0c7f9aaSSamuel Khuvis typedef void  (*ps_initialize_t)(void);
47*a0c7f9aaSSamuel Khuvis typedef void  (*ps_finalize_t)(void);
48*a0c7f9aaSSamuel Khuvis typedef void  (*ps_register_thread_t)(void);
49*a0c7f9aaSSamuel Khuvis typedef void  (*ps_dump_data_t)(void);
50*a0c7f9aaSSamuel Khuvis /* Data entry functions */
51*a0c7f9aaSSamuel Khuvis typedef void* (*ps_timer_create_t)(const char *);
52*a0c7f9aaSSamuel Khuvis typedef void  (*ps_timer_start_t)(const void *);
53*a0c7f9aaSSamuel Khuvis typedef void  (*ps_timer_stop_t)(const void *);
54*a0c7f9aaSSamuel Khuvis typedef void  (*ps_set_parameter_t)(const char *, int64_t);
55*a0c7f9aaSSamuel Khuvis typedef void  (*ps_dynamic_phase_start_t)(const char *, int);
56*a0c7f9aaSSamuel Khuvis typedef void  (*ps_dynamic_phase_stop_t)(const char *, int);
57*a0c7f9aaSSamuel Khuvis typedef void* (*ps_create_counter_t)(const char *);
58*a0c7f9aaSSamuel Khuvis typedef void  (*ps_sample_counter_t)(const void *, double);
59*a0c7f9aaSSamuel Khuvis typedef void  (*ps_set_metadata_t)(const char *, const char *);
60*a0c7f9aaSSamuel Khuvis /* Data Query Functions */
61*a0c7f9aaSSamuel Khuvis typedef void  (*ps_get_timer_data_t)(ps_tool_timer_data_t *);
62*a0c7f9aaSSamuel Khuvis typedef void  (*ps_get_counter_data_t)(ps_tool_counter_data_t *);
63*a0c7f9aaSSamuel Khuvis typedef void  (*ps_get_metadata_t)(ps_tool_metadata_t *);
64*a0c7f9aaSSamuel Khuvis typedef void  (*ps_free_timer_data_t)(ps_tool_timer_data_t *);
65*a0c7f9aaSSamuel Khuvis typedef void  (*ps_free_counter_data_t)(ps_tool_counter_data_t *);
66*a0c7f9aaSSamuel Khuvis typedef void  (*ps_free_metadata_t)(ps_tool_metadata_t *);
67*a0c7f9aaSSamuel Khuvis 
68*a0c7f9aaSSamuel Khuvis /****************************************************************************/
69*a0c7f9aaSSamuel Khuvis /* Declare the structure used to register a tool */
70*a0c7f9aaSSamuel Khuvis /****************************************************************************/
71*a0c7f9aaSSamuel Khuvis 
72*a0c7f9aaSSamuel Khuvis typedef struct ps_plugin_data {
73*a0c7f9aaSSamuel Khuvis     char * tool_name;
74*a0c7f9aaSSamuel Khuvis     /* Logistical functions */
75*a0c7f9aaSSamuel Khuvis     ps_initialize_t initialize;
76*a0c7f9aaSSamuel Khuvis     ps_finalize_t finalize;
77*a0c7f9aaSSamuel Khuvis     ps_register_thread_t register_thread;
78*a0c7f9aaSSamuel Khuvis     ps_dump_data_t dump_data;
79*a0c7f9aaSSamuel Khuvis     /* Data entry functions */
80*a0c7f9aaSSamuel Khuvis     ps_timer_create_t timer_create;
81*a0c7f9aaSSamuel Khuvis     ps_timer_start_t timer_start;
82*a0c7f9aaSSamuel Khuvis     ps_timer_stop_t timer_stop;
83*a0c7f9aaSSamuel Khuvis     ps_set_parameter_t set_parameter;
84*a0c7f9aaSSamuel Khuvis     ps_dynamic_phase_start_t dynamic_phase_start;
85*a0c7f9aaSSamuel Khuvis     ps_dynamic_phase_stop_t dynamic_phase_stop;
86*a0c7f9aaSSamuel Khuvis     ps_create_counter_t create_counter;
87*a0c7f9aaSSamuel Khuvis     ps_sample_counter_t sample_counter;
88*a0c7f9aaSSamuel Khuvis     ps_set_metadata_t set_metadata;
89*a0c7f9aaSSamuel Khuvis     /* Data Query Functions */
90*a0c7f9aaSSamuel Khuvis     ps_get_timer_data_t get_timer_data;
91*a0c7f9aaSSamuel Khuvis     ps_get_counter_data_t get_counter_data;
92*a0c7f9aaSSamuel Khuvis     ps_get_metadata_t get_metadata;
93*a0c7f9aaSSamuel Khuvis     ps_free_timer_data_t free_timer_data;
94*a0c7f9aaSSamuel Khuvis     ps_free_counter_data_t free_counter_data;
95*a0c7f9aaSSamuel Khuvis     ps_free_metadata_t free_metadata;
96*a0c7f9aaSSamuel Khuvis } ps_plugin_data_t;
97*a0c7f9aaSSamuel Khuvis 
98*a0c7f9aaSSamuel Khuvis /****************************************************************************/
99*a0c7f9aaSSamuel Khuvis /* Declare the register/deregister weak symbols (implemented by the plugin API
100*a0c7f9aaSSamuel Khuvis  * for the registration process */
101*a0c7f9aaSSamuel Khuvis /****************************************************************************/
102*a0c7f9aaSSamuel Khuvis 
103*a0c7f9aaSSamuel Khuvis typedef int  (*ps_register_t)(ps_plugin_data_t *);
104*a0c7f9aaSSamuel Khuvis typedef void (*ps_deregister_t)(int);
105*a0c7f9aaSSamuel Khuvis 
106*a0c7f9aaSSamuel Khuvis #ifdef __cplusplus
107*a0c7f9aaSSamuel Khuvis extern "C" {
108*a0c7f9aaSSamuel Khuvis #endif
109*a0c7f9aaSSamuel Khuvis 
110*a0c7f9aaSSamuel Khuvis #ifdef __linux__
111*a0c7f9aaSSamuel Khuvis extern __attribute__((weak)) int  ps_register_tool(ps_plugin_data_t * tool);
112*a0c7f9aaSSamuel Khuvis extern __attribute__((weak)) void ps_deregister_tool(int tool_id);
113*a0c7f9aaSSamuel Khuvis #else /* use _WIN32 or _WIN64 */
114*a0c7f9aaSSamuel Khuvis extern int  ps_register_tool(ps_plugin_data_t * tool);
115*a0c7f9aaSSamuel Khuvis extern void ps_deregister_tool(int tool_id);
116*a0c7f9aaSSamuel Khuvis #endif
117*a0c7f9aaSSamuel Khuvis 
118*a0c7f9aaSSamuel Khuvis #ifdef __cplusplus
119*a0c7f9aaSSamuel Khuvis }
120*a0c7f9aaSSamuel Khuvis #endif
121*a0c7f9aaSSamuel Khuvis 
122