1 /* OpenACC Profiling Interface 2 3 Copyright (C) 2019-2020 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 */ 253