1 /* OpenACC Profiling Interface
3 Copyright (C) 2019-2023 Free Software Foundation, Inc.
5 Contributed by Mentor, a Siemens Business.
7 This file is part of the GNU Offloading and Multi Processing Library
10 Libgomp is free software; you can redistribute it and/or modify it
11 under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3, or (at your option)
15 Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 FOR A PARTICULAR PURPOSE. See the GNU General Public License for
20 Under Section 7 of GPL version 3, you are granted additional
21 permissions described in the GCC Runtime Library Exception, version
22 3.1, as published by the Free Software Foundation.
24 You should have received a copy of the GNU General Public License and
25 a copy of the GCC Runtime Library Exception along with this program;
26 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
27 <http://www.gnu.org/licenses/>. */
33 /* The OpenACC specification doesn't say so explicitly, but as its Profiling
34 Interface explicitly makes use of, for example, <openacc.h>'s
35 'acc_device_t', we supposedly are to '#include' that file here. */
47 typedef enum acc_event_t
50 acc_ev_device_init_start
,
51 acc_ev_device_init_end
,
52 acc_ev_device_shutdown_start
,
53 acc_ev_device_shutdown_end
,
54 acc_ev_runtime_shutdown
,
59 acc_ev_enter_data_start
,
60 acc_ev_enter_data_end
,
61 acc_ev_exit_data_start
,
65 acc_ev_compute_construct_start
,
66 acc_ev_compute_construct_end
,
67 acc_ev_enqueue_launch_start
,
68 acc_ev_enqueue_launch_end
,
69 acc_ev_enqueue_upload_start
,
70 acc_ev_enqueue_upload_end
,
71 acc_ev_enqueue_download_start
,
72 acc_ev_enqueue_download_end
,
79 /* Callbacks Signature. */
81 /* "The datatype 'ssize_t' means a signed 32-bit integer for a 32-bit binary
82 and a 64-bit integer for a 64-bit binary". */
83 typedef signed long int _acc_prof_ssize_t
;
84 /* "The datatype 'size_t' means an unsigned 32-bit integer for a 32-bit binary
85 and a 64-bit integer for a 64-bit binary". */
86 typedef unsigned long int _acc_prof_size_t
;
87 /* "The datatype 'int' means a 32-bit integer for both 32-bit and 64-bit
89 typedef int _acc_prof_int_t
;
91 /* Internal helpers: a struct's 'valid_bytes' may be less than its 'sizeof'. */
92 #define _ACC_PROF_VALID_BYTES_STRUCT(_struct, _lastfield, _valid_bytes_lastfield) \
93 offsetof (_struct, _lastfield) + (_valid_bytes_lastfield)
95 #define _ACC_PROF_VALID_BYTES_TYPE_N(_type, _n, _valid_bytes_type) \
96 ((_n - 1) * sizeof (_type) + (_valid_bytes_type))
98 #define _ACC_PROF_VALID_BYTES_BASICTYPE(_basictype) \
101 typedef struct acc_prof_info
103 acc_event_t event_type
;
104 _acc_prof_int_t valid_bytes
;
105 _acc_prof_int_t version
;
106 acc_device_t device_type
;
107 _acc_prof_int_t device_number
;
108 _acc_prof_int_t thread_id
;
109 _acc_prof_ssize_t async
;
110 _acc_prof_ssize_t async_queue
;
111 const char *src_file
;
112 const char *func_name
;
113 _acc_prof_int_t line_no
, end_line_no
;
114 _acc_prof_int_t func_line_no
, func_end_line_no
;
115 #define _ACC_PROF_INFO_VALID_BYTES \
116 _ACC_PROF_VALID_BYTES_STRUCT (acc_prof_info, func_end_line_no, \
117 _ACC_PROF_VALID_BYTES_BASICTYPE (_acc_prof_int_t))
120 /* We implement the OpenACC 2.6 Profiling Interface. */
122 #define _ACC_PROF_INFO_VERSION 201711
124 typedef enum acc_construct_t
126 acc_construct_parallel
= 0,
127 acc_construct_kernels
,
130 acc_construct_enter_data
,
131 acc_construct_exit_data
,
132 acc_construct_host_data
,
133 acc_construct_atomic
,
134 acc_construct_declare
,
136 acc_construct_shutdown
,
138 acc_construct_update
,
139 acc_construct_routine
,
141 acc_construct_runtime_api
,
145 typedef struct acc_data_event_info
147 acc_event_t event_type
;
148 _acc_prof_int_t valid_bytes
;
149 acc_construct_t parent_construct
;
150 _acc_prof_int_t implicit
;
152 const char *var_name
;
153 _acc_prof_size_t bytes
;
154 const void *host_ptr
;
155 const void *device_ptr
;
156 #define _ACC_DATA_EVENT_INFO_VALID_BYTES \
157 _ACC_PROF_VALID_BYTES_STRUCT (acc_data_event_info, device_ptr, \
158 _ACC_PROF_VALID_BYTES_BASICTYPE (void *))
159 } acc_data_event_info
;
161 typedef struct acc_launch_event_info
163 acc_event_t event_type
;
164 _acc_prof_int_t valid_bytes
;
165 acc_construct_t parent_construct
;
166 _acc_prof_int_t implicit
;
168 const char *kernel_name
;
169 _acc_prof_size_t num_gangs
, num_workers
, vector_length
;
170 #define _ACC_LAUNCH_EVENT_INFO_VALID_BYTES \
171 _ACC_PROF_VALID_BYTES_STRUCT (acc_launch_event_info, vector_length, \
172 _ACC_PROF_VALID_BYTES_BASICTYPE (_acc_prof_size_t))
173 } acc_launch_event_info
;
175 typedef struct acc_other_event_info
177 acc_event_t event_type
;
178 _acc_prof_int_t valid_bytes
;
179 acc_construct_t parent_construct
;
180 _acc_prof_int_t implicit
;
182 #define _ACC_OTHER_EVENT_INFO_VALID_BYTES \
183 _ACC_PROF_VALID_BYTES_STRUCT (acc_other_event_info, tool_info, \
184 _ACC_PROF_VALID_BYTES_BASICTYPE (void *))
185 } acc_other_event_info
;
187 typedef union acc_event_info
189 acc_event_t event_type
;
190 acc_data_event_info data_event
;
191 acc_launch_event_info launch_event
;
192 acc_other_event_info other_event
;
195 typedef enum acc_device_api
197 acc_device_api_none
= 0,
199 acc_device_api_opencl
,
204 typedef struct acc_api_info
206 acc_device_api device_api
;
207 _acc_prof_int_t valid_bytes
;
208 acc_device_t device_type
;
209 _acc_prof_int_t vendor
;
210 const void *device_handle
;
211 const void *context_handle
;
212 const void *async_handle
;
213 #define _ACC_API_INFO_VALID_BYTES \
214 _ACC_PROF_VALID_BYTES_STRUCT (acc_api_info, async_handle, \
215 _ACC_PROF_VALID_BYTES_BASICTYPE (void *))
218 /* Don't tag 'acc_prof_callback' as '__GOACC_NOTHROW': these functions are
219 provided by user code, and must be expected to do anything. */
220 typedef void (*acc_prof_callback
) (acc_prof_info
*, acc_event_info
*,
224 /* Loading the Library. */
226 typedef enum acc_register_t
230 acc_toggle_per_thread
= 2
233 typedef void (*acc_prof_reg
) (acc_event_t
, acc_prof_callback
, acc_register_t
);
234 extern void acc_prof_register (acc_event_t
, acc_prof_callback
,
235 acc_register_t
) __GOACC_NOTHROW
;
236 extern void acc_prof_unregister (acc_event_t
, acc_prof_callback
,
237 acc_register_t
) __GOACC_NOTHROW
;
238 typedef void (*acc_query_fn
) ();
239 typedef acc_query_fn (*acc_prof_lookup_func
) (const char *);
240 extern acc_query_fn
acc_prof_lookup (const char *) __GOACC_NOTHROW
;
241 /* Don't tag 'acc_register_library' as '__GOACC_NOTHROW': this function can be
242 overridden by user code, and must be expected to do anything. */
243 extern void acc_register_library (acc_prof_reg
, acc_prof_reg
,
244 acc_prof_lookup_func
);
252 #endif /* _ACC_PROF_H */