aboutsummaryrefslogtreecommitdiff
path: root/libgomp/oacc-int.h
blob: 8ab73519aa8e49a01cf113988d3857e0d352da4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
/* OpenACC Runtime - internal declarations

   Copyright (C) 2013-2021 Free Software Foundation, Inc.

   Contributed by Mentor Embedded.

   This file is part of the GNU Offloading and Multi Processing Library
   (libgomp).

   Libgomp is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

/* This file contains data types and function declarations that are not
   part of the official OpenACC user interface.  There are declarations
   in here that are part of the GNU OpenACC ABI, in that the compiler is
   required to know about them and use them.

   The convention is that the all caps prefix "GOACC" is used group items
   that are part of the external ABI, and the lower case prefix "goacc"
   is used group items that are completely private to the library.  */

#ifndef OACC_INT_H
#define OACC_INT_H 1

#include "openacc.h"
#include "config.h"
#include "acc_prof.h"
#include <stddef.h>
#include <stdbool.h>
#include <stdarg.h>

#ifdef HAVE_ATTRIBUTE_VISIBILITY
# pragma GCC visibility push(hidden)
#endif

static inline enum acc_device_t
acc_device_type (enum offload_target_type type)
{
  return (enum acc_device_t) type;
}

struct goacc_thread
{
  /* The base device for the current thread.  */
  struct gomp_device_descr *base_dev;

  /* The device for the current thread.  */
  struct gomp_device_descr *dev;

  struct gomp_device_descr *saved_bound_dev;

  /* This is a linked list of data mapped by the "acc data" pragma, following
     strictly push/pop semantics according to lexical scope.  */
  struct target_mem_desc *mapped_data;

  /* Data of the OpenACC Profiling Interface.  */
  acc_prof_info *prof_info;
  acc_api_info *api_info;
  /* Per-thread toggle of OpenACC Profiling Interface callbacks.  */
  bool prof_callbacks_enabled;

  /* These structures form a list: this is the next thread in that list.  */
  struct goacc_thread *next;

  /* Target-specific data (used by plugin).  */
  void *target_tls;
};

#ifdef __AMDGCN__
static inline struct goacc_thread *
goacc_thread (void)
{
  /* Unused in the offload libgomp for OpenACC: return a dummy value.  */
  return 0;
}
#elif defined HAVE_TLS || defined USE_EMUTLS
extern __thread struct goacc_thread *goacc_tls_data;
static inline struct goacc_thread *
goacc_thread (void)
{
  return goacc_tls_data;
}
#else
extern pthread_key_t goacc_tls_key;
static inline struct goacc_thread *
goacc_thread (void)
{
  return pthread_getspecific (goacc_tls_key);
}
#endif

void goacc_register (struct gomp_device_descr *) __GOACC_NOTHROW;
void goacc_attach_host_thread_to_device (int);
void goacc_runtime_initialize (void);
void goacc_save_and_set_bind (acc_device_t);
void goacc_restore_bind (void);
void goacc_lazy_initialize (void);
void goacc_host_init (void);

void goacc_wait (int, int, va_list *);
void goacc_init_asyncqueues (struct gomp_device_descr *);
bool goacc_fini_asyncqueues (struct gomp_device_descr *);
void goacc_async_free (struct gomp_device_descr *, struct goacc_asyncqueue *,
		       void *);
struct goacc_asyncqueue *get_goacc_asyncqueue (int);
struct goacc_asyncqueue *lookup_goacc_asyncqueue (struct goacc_thread *, bool,
						  int);
static inline bool
async_valid_stream_id_p (int async)
{
  return async >= 0;
}

static inline bool
async_valid_p (int async)
{
  return (async == acc_async_noval || async == acc_async_sync
	  || async_valid_stream_id_p (async));
}

static inline bool
async_synchronous_p (int async)
{
  if (!async_valid_p (async))
    return true;

  return async == acc_async_sync;
}


extern bool goacc_prof_enabled;
/* Tune for the (very common) case that profiling is not enabled.  */
#define GOACC_PROF_ENABLED \
  (__builtin_expect (__atomic_load_n (&goacc_prof_enabled, \
				      MEMMODEL_ACQUIRE) == true, false))

void goacc_profiling_initialize (void);
bool _goacc_profiling_dispatch_p (bool);
/* Tune for the (very common) case that profiling is not enabled.  */
#define GOACC_PROFILING_DISPATCH_P(...) \
  (GOACC_PROF_ENABLED \
   && _goacc_profiling_dispatch_p (__VA_ARGS__))
bool _goacc_profiling_setup_p (struct goacc_thread *,
			       acc_prof_info *, acc_api_info *);
/* Tune for the (very common) case that profiling is not enabled.  */
#define GOACC_PROFILING_SETUP_P(...) \
  (GOACC_PROFILING_DISPATCH_P (false) \
   && _goacc_profiling_setup_p (__VA_ARGS__))
void goacc_profiling_dispatch (acc_prof_info *, acc_event_info *,
			       acc_api_info *);

/* Definitions for data structures describing OpenACC non-contiguous arrays
   (Note: interfaces with compiler)

   The compiler generates a descriptor for each such array, places the
   descriptor on stack, and passes the address of the descriptor to the libgomp
   runtime as a normal map argument. The runtime then processes the array
   data structure setup, and replaces the argument with the new actual
   array address for the child function.

   Care must be taken such that the struct field and layout assumptions
   of struct goacc_ncarray_dim, goacc_ncarray_descr_type inside the compiler
   be consistant with the below declarations.  */

struct goacc_ncarray_dim {
  size_t base;
  size_t length;
  size_t elem_size;
  size_t is_array;
};

struct goacc_ncarray_descr_type
{
  size_t ndims;
  struct goacc_ncarray_dim dims[];
};

/* Internal non-contiguous array info struct, used only here inside the runtime. */

struct goacc_ncarray
{
  struct goacc_ncarray_descr_type *descr;
  void *ptr;
  size_t map_index;
  size_t ptrblock_size;
  void **data_rows;
  void **tgt_data_rows;
  size_t data_row_num;
  size_t data_row_size;
};

struct goacc_ncarray_info
{
  size_t num_data_rows, num_ncarray;
  void **data_rows;
  void **tgt_data_rows;
  struct goacc_ncarray ncarray[];
};

extern void *goacc_noncontig_array_create_ptrblock (struct goacc_ncarray *, void *);


#ifdef HAVE_ATTRIBUTE_VISIBILITY
# pragma GCC visibility pop
#endif

#endif