]> git.ipfire.org Git - thirdparty/gcc.git/blob - libgomp/acc_prof.h
Daily bump.
[thirdparty/gcc.git] / libgomp / acc_prof.h
1 /* OpenACC Profiling Interface
2
3 Copyright (C) 2019-2024 Free Software Foundation, Inc.
4
5 Contributed by Mentor, a Siemens Business.
6
7 This file is part of the GNU Offloading and Multi Processing Library
8 (libgomp).
9
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)
13 any later version.
14
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
18 more details.
19
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.
23
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/>. */
28
29 #ifndef _ACC_PROF_H
30 #define _ACC_PROF_H 1
31
32
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. */
36
37 #include <openacc.h>
38
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44
45 /* Events. */
46
47 typedef enum acc_event_t
48 {
49 acc_ev_none = 0,
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,
55 acc_ev_create,
56 acc_ev_delete,
57 acc_ev_alloc,
58 acc_ev_free,
59 acc_ev_enter_data_start,
60 acc_ev_enter_data_end,
61 acc_ev_exit_data_start,
62 acc_ev_exit_data_end,
63 acc_ev_update_start,
64 acc_ev_update_end,
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,
73 acc_ev_wait_start,
74 acc_ev_wait_end,
75 acc_ev_last
76 } acc_event_t;
77
78
79 /* Callbacks Signature. */
80
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
88 binaries". */
89 typedef int _acc_prof_int_t;
90
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)
94 #if 0 /* Untested. */
95 #define _ACC_PROF_VALID_BYTES_TYPE_N(_type, _n, _valid_bytes_type) \
96 ((_n - 1) * sizeof (_type) + (_valid_bytes_type))
97 #endif
98 #define _ACC_PROF_VALID_BYTES_BASICTYPE(_basictype) \
99 (sizeof (_basictype))
100
101 typedef struct acc_prof_info
102 {
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))
118 } acc_prof_info;
119
120 /* We implement the OpenACC 2.6 Profiling Interface. */
121
122 #define _ACC_PROF_INFO_VERSION 201711
123
124 typedef enum acc_construct_t
125 {
126 acc_construct_parallel = 0,
127 acc_construct_kernels,
128 acc_construct_loop,
129 acc_construct_data,
130 acc_construct_enter_data,
131 acc_construct_exit_data,
132 acc_construct_host_data,
133 acc_construct_atomic,
134 acc_construct_declare,
135 acc_construct_init,
136 acc_construct_shutdown,
137 acc_construct_set,
138 acc_construct_update,
139 acc_construct_routine,
140 acc_construct_wait,
141 acc_construct_runtime_api,
142 acc_construct_serial
143 } acc_construct_t;
144
145 typedef struct acc_data_event_info
146 {
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;
151 void *tool_info;
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;
160
161 typedef struct acc_launch_event_info
162 {
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;
167 void *tool_info;
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;
174
175 typedef struct acc_other_event_info
176 {
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;
181 void *tool_info;
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;
186
187 typedef union acc_event_info
188 {
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;
193 } acc_event_info;
194
195 typedef enum acc_device_api
196 {
197 acc_device_api_none = 0,
198 acc_device_api_cuda,
199 acc_device_api_opencl,
200 acc_device_api_coi,
201 acc_device_api_other
202 } acc_device_api;
203
204 typedef struct acc_api_info
205 {
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 *))
216 } acc_api_info;
217
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 *,
221 acc_api_info *);
222
223
224 /* Loading the Library. */
225
226 typedef enum acc_register_t
227 {
228 acc_reg = 0,
229 acc_toggle = 1,
230 acc_toggle_per_thread = 2
231 } acc_register_t;
232
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);
245
246
247 #ifdef __cplusplus
248 }
249 #endif
250
251
252 #endif /* _ACC_PROF_H */