(root)/
gcc-13.2.0/
libgomp/
acc_prof.h
       1  /* OpenACC Profiling Interface
       2  
       3     Copyright (C) 2019-2023 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 */