annotate libgomp/oacc-mem.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* OpenACC Runtime initialization routines
kono
parents:
diff changeset
2
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3 Copyright (C) 2013-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 Contributed by Mentor Embedded.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 This file is part of the GNU Offloading and Multi Processing Library
kono
parents:
diff changeset
8 (libgomp).
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 Libgomp is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
11 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
12 the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
13 any later version.
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
kono
parents:
diff changeset
17 FOR A PARTICULAR PURPOSE. See the GNU General Public License for
kono
parents:
diff changeset
18 more details.
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 Under Section 7 of GPL version 3, you are granted additional
kono
parents:
diff changeset
21 permissions described in the GCC Runtime Library Exception, version
kono
parents:
diff changeset
22 3.1, as published by the Free Software Foundation.
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 You should have received a copy of the GNU General Public License and
kono
parents:
diff changeset
25 a copy of the GCC Runtime Library Exception along with this program;
kono
parents:
diff changeset
26 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
kono
parents:
diff changeset
27 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 #include "openacc.h"
kono
parents:
diff changeset
30 #include "libgomp.h"
kono
parents:
diff changeset
31 #include "gomp-constants.h"
kono
parents:
diff changeset
32 #include "oacc-int.h"
kono
parents:
diff changeset
33 #include <string.h>
kono
parents:
diff changeset
34 #include <assert.h>
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 /* Return block containing [H->S), or NULL if not contained. The device lock
kono
parents:
diff changeset
37 for DEV must be locked on entry, and remains locked on exit. */
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 static splay_tree_key
kono
parents:
diff changeset
40 lookup_host (struct gomp_device_descr *dev, void *h, size_t s)
kono
parents:
diff changeset
41 {
kono
parents:
diff changeset
42 struct splay_tree_key_s node;
kono
parents:
diff changeset
43 splay_tree_key key;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 node.host_start = (uintptr_t) h;
kono
parents:
diff changeset
46 node.host_end = (uintptr_t) h + s;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 key = splay_tree_lookup (&dev->mem_map, &node);
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 return key;
kono
parents:
diff changeset
51 }
kono
parents:
diff changeset
52
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
53 /* Helper for lookup_dev. Iterate over splay tree. */
111
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 static splay_tree_key
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
56 lookup_dev_1 (splay_tree_node node, uintptr_t d, size_t s)
111
kono
parents:
diff changeset
57 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
58 splay_tree_key key = &node->key;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
59 if (d >= key->tgt->tgt_start && d + s <= key->tgt->tgt_end)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
60 return key;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
62 key = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
63 if (node->left)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
64 key = lookup_dev_1 (node->left, d, s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
65 if (!key && node->right)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
66 key = lookup_dev_1 (node->right, d, s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
68 return key;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
69 }
111
kono
parents:
diff changeset
70
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
71 /* Return block containing [D->S), or NULL if not contained.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
72
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
73 This iterates over the splay tree. This is not expected to be a common
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
74 operation.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
75
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
76 The device lock associated with MEM_MAP must be locked on entry, and remains
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
77 locked on exit. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
78
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
79 static splay_tree_key
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
80 lookup_dev (splay_tree mem_map, void *d, size_t s)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
81 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
82 if (!mem_map || !mem_map->root)
111
kono
parents:
diff changeset
83 return NULL;
kono
parents:
diff changeset
84
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
85 return lookup_dev_1 (mem_map->root, (uintptr_t) d, s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
86 }
111
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 /* OpenACC is silent on how memory exhaustion is indicated. We return
kono
parents:
diff changeset
90 NULL. */
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 void *
kono
parents:
diff changeset
93 acc_malloc (size_t s)
kono
parents:
diff changeset
94 {
kono
parents:
diff changeset
95 if (!s)
kono
parents:
diff changeset
96 return NULL;
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 goacc_lazy_initialize ();
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 assert (thr->dev);
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
105 return malloc (s);
kono
parents:
diff changeset
106
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
107 acc_prof_info prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
108 acc_api_info api_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
109 bool profiling_p = GOACC_PROFILING_SETUP_P (thr, &prof_info, &api_info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
110
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
111 void *res = thr->dev->alloc_func (thr->dev->target_id, s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
112
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
113 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
114 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
115 thr->prof_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
116 thr->api_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
117 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
118
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
119 return res;
111
kono
parents:
diff changeset
120 }
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 void
kono
parents:
diff changeset
123 acc_free (void *d)
kono
parents:
diff changeset
124 {
kono
parents:
diff changeset
125 splay_tree_key k;
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 if (!d)
kono
parents:
diff changeset
128 return;
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 assert (thr && thr->dev);
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
137 return free (d);
kono
parents:
diff changeset
138
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
139 acc_prof_info prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
140 acc_api_info api_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
141 bool profiling_p = GOACC_PROFILING_SETUP_P (thr, &prof_info, &api_info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
142
111
kono
parents:
diff changeset
143 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 /* We don't have to call lazy open here, as the ptr value must have
kono
parents:
diff changeset
146 been returned by acc_malloc. It's not permitted to pass NULL in
kono
parents:
diff changeset
147 (unless you got that null from acc_malloc). */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
148 if ((k = lookup_dev (&acc_dev->mem_map, d, 1)))
111
kono
parents:
diff changeset
149 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
150 void *offset = d - k->tgt->tgt_start + k->tgt_offset;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
151 void *h = k->host_start + offset;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
152 size_t h_size = k->host_end - k->host_start;
111
kono
parents:
diff changeset
153 gomp_mutex_unlock (&acc_dev->lock);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
154 /* PR92503 "[OpenACC] Behavior of 'acc_free' if the memory space is still
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
155 used in a mapping". */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
156 gomp_fatal ("refusing to free device memory space at %p that is still"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
157 " mapped at [%p,+%d]",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
158 d, h, (int) h_size);
111
kono
parents:
diff changeset
159 }
kono
parents:
diff changeset
160 else
kono
parents:
diff changeset
161 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 if (!acc_dev->free_func (acc_dev->target_id, d))
kono
parents:
diff changeset
164 gomp_fatal ("error in freeing device memory in %s", __FUNCTION__);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
165
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
166 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
167 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
168 thr->prof_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
169 thr->api_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
170 }
111
kono
parents:
diff changeset
171 }
kono
parents:
diff changeset
172
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
173 static void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
174 memcpy_tofrom_device (bool from, void *d, void *h, size_t s, int async,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
175 const char *libfnname)
111
kono
parents:
diff changeset
176 {
kono
parents:
diff changeset
177 /* No need to call lazy open here, as the device pointer must have
kono
parents:
diff changeset
178 been obtained from a routine that did that. */
kono
parents:
diff changeset
179 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 assert (thr && thr->dev);
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
184 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
185 if (from)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
186 memmove (h, d, s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
187 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
188 memmove (d, h, s);
111
kono
parents:
diff changeset
189 return;
kono
parents:
diff changeset
190 }
kono
parents:
diff changeset
191
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
192 acc_prof_info prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
193 acc_api_info api_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
194 bool profiling_p = GOACC_PROFILING_SETUP_P (thr, &prof_info, &api_info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
195 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
196 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
197 prof_info.async = async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
198 prof_info.async_queue = prof_info.async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
199 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
200
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
201 goacc_aq aq = get_goacc_asyncqueue (async);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
202 if (from)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 gomp_copy_dev2host (thr->dev, aq, h, d, s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
204 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
205 gomp_copy_host2dev (thr->dev, aq, d, h, s, /* TODO: cbuf? */ NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
206
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
207 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
208 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
209 thr->prof_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
210 thr->api_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
211 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
212 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
213
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
214 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
215 acc_memcpy_to_device (void *d, void *h, size_t s)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
216 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
217 memcpy_tofrom_device (false, d, h, s, acc_async_sync, __FUNCTION__);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
218 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
219
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
220 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
221 acc_memcpy_to_device_async (void *d, void *h, size_t s, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
222 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
223 memcpy_tofrom_device (false, d, h, s, async, __FUNCTION__);
111
kono
parents:
diff changeset
224 }
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 void
kono
parents:
diff changeset
227 acc_memcpy_from_device (void *h, void *d, size_t s)
kono
parents:
diff changeset
228 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
229 memcpy_tofrom_device (true, d, h, s, acc_async_sync, __FUNCTION__);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
230 }
111
kono
parents:
diff changeset
231
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
232 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
233 acc_memcpy_from_device_async (void *h, void *d, size_t s, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
234 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
235 memcpy_tofrom_device (true, d, h, s, async, __FUNCTION__);
111
kono
parents:
diff changeset
236 }
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 /* Return the device pointer that corresponds to host data H. Or NULL
kono
parents:
diff changeset
239 if no mapping. */
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 void *
kono
parents:
diff changeset
242 acc_deviceptr (void *h)
kono
parents:
diff changeset
243 {
kono
parents:
diff changeset
244 splay_tree_key n;
kono
parents:
diff changeset
245 void *d;
kono
parents:
diff changeset
246 void *offset;
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 goacc_lazy_initialize ();
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
251 struct gomp_device_descr *dev = thr->dev;
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
254 return h;
kono
parents:
diff changeset
255
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
256 /* In the following, no OpenACC Profiling Interface events can possibly be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
257 generated. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
258
111
kono
parents:
diff changeset
259 gomp_mutex_lock (&dev->lock);
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 n = lookup_host (dev, h, 1);
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 if (!n)
kono
parents:
diff changeset
264 {
kono
parents:
diff changeset
265 gomp_mutex_unlock (&dev->lock);
kono
parents:
diff changeset
266 return NULL;
kono
parents:
diff changeset
267 }
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 offset = h - n->host_start;
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 d = n->tgt->tgt_start + n->tgt_offset + offset;
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 gomp_mutex_unlock (&dev->lock);
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 return d;
kono
parents:
diff changeset
276 }
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 /* Return the host pointer that corresponds to device data D. Or NULL
kono
parents:
diff changeset
279 if no mapping. */
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 void *
kono
parents:
diff changeset
282 acc_hostptr (void *d)
kono
parents:
diff changeset
283 {
kono
parents:
diff changeset
284 splay_tree_key n;
kono
parents:
diff changeset
285 void *h;
kono
parents:
diff changeset
286 void *offset;
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 goacc_lazy_initialize ();
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
291 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
294 return d;
kono
parents:
diff changeset
295
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
296 /* In the following, no OpenACC Profiling Interface events can possibly be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
297 generated. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
298
111
kono
parents:
diff changeset
299 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
300
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
301 n = lookup_dev (&acc_dev->mem_map, d, 1);
111
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 if (!n)
kono
parents:
diff changeset
304 {
kono
parents:
diff changeset
305 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
306 return NULL;
kono
parents:
diff changeset
307 }
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 offset = d - n->tgt->tgt_start + n->tgt_offset;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 h = n->host_start + offset;
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 return h;
kono
parents:
diff changeset
316 }
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 /* Return 1 if host data [H,+S] is present on the device. */
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 int
kono
parents:
diff changeset
321 acc_is_present (void *h, size_t s)
kono
parents:
diff changeset
322 {
kono
parents:
diff changeset
323 splay_tree_key n;
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 if (!s || !h)
kono
parents:
diff changeset
326 return 0;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 goacc_lazy_initialize ();
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
331 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
334 return h != NULL;
kono
parents:
diff changeset
335
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
336 /* In the following, no OpenACC Profiling Interface events can possibly be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
337 generated. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
338
111
kono
parents:
diff changeset
339 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 n = lookup_host (acc_dev, h, s);
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 if (n && ((uintptr_t)h < n->host_start
kono
parents:
diff changeset
344 || (uintptr_t)h + s > n->host_end
kono
parents:
diff changeset
345 || s > n->host_end - n->host_start))
kono
parents:
diff changeset
346 n = NULL;
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 return n != NULL;
kono
parents:
diff changeset
351 }
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 /* Create a mapping for host [H,+S] -> device [D,+S] */
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 void
kono
parents:
diff changeset
356 acc_map_data (void *h, void *d, size_t s)
kono
parents:
diff changeset
357 {
kono
parents:
diff changeset
358 struct target_mem_desc *tgt = NULL;
kono
parents:
diff changeset
359 size_t mapnum = 1;
kono
parents:
diff changeset
360 void *hostaddrs = h;
kono
parents:
diff changeset
361 void *devaddrs = d;
kono
parents:
diff changeset
362 size_t sizes = s;
kono
parents:
diff changeset
363 unsigned short kinds = GOMP_MAP_ALLOC;
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 goacc_lazy_initialize ();
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
368 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
371 {
kono
parents:
diff changeset
372 if (d != h)
kono
parents:
diff changeset
373 gomp_fatal ("cannot map data on shared-memory system");
kono
parents:
diff changeset
374 }
kono
parents:
diff changeset
375 else
kono
parents:
diff changeset
376 {
kono
parents:
diff changeset
377 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 if (!d || !h || !s)
kono
parents:
diff changeset
380 gomp_fatal ("[%p,+%d]->[%p,+%d] is a bad map",
kono
parents:
diff changeset
381 (void *)h, (int)s, (void *)d, (int)s);
kono
parents:
diff changeset
382
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
383 acc_prof_info prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
384 acc_api_info api_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
385 bool profiling_p = GOACC_PROFILING_SETUP_P (thr, &prof_info, &api_info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
386
111
kono
parents:
diff changeset
387 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 if (lookup_host (acc_dev, h, s))
kono
parents:
diff changeset
390 {
kono
parents:
diff changeset
391 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
392 gomp_fatal ("host address [%p, +%d] is already mapped", (void *)h,
kono
parents:
diff changeset
393 (int)s);
kono
parents:
diff changeset
394 }
kono
parents:
diff changeset
395
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
396 if (lookup_dev (&thr->dev->mem_map, d, s))
111
kono
parents:
diff changeset
397 {
kono
parents:
diff changeset
398 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
399 gomp_fatal ("device address [%p, +%d] is already mapped", (void *)d,
kono
parents:
diff changeset
400 (int)s);
kono
parents:
diff changeset
401 }
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 tgt = gomp_map_vars (acc_dev, mapnum, &hostaddrs, &devaddrs, &sizes,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
406 &kinds, true, GOMP_MAP_VARS_ENTER_DATA);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
407 assert (tgt);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
408 splay_tree_key n = tgt->list[0].key;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
409 assert (n->refcount == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
410 assert (n->virtual_refcount == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
411 /* Special reference counting behavior. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
412 n->refcount = REFCOUNT_INFINITY;
111
kono
parents:
diff changeset
413
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
414 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
415 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
416 thr->prof_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
417 thr->api_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
418 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
419 }
111
kono
parents:
diff changeset
420 }
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 void
kono
parents:
diff changeset
423 acc_unmap_data (void *h)
kono
parents:
diff changeset
424 {
kono
parents:
diff changeset
425 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
426 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 /* No need to call lazy open, as the address must have been mapped. */
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 /* This is a no-op on shared-memory targets. */
kono
parents:
diff changeset
431 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
432 return;
kono
parents:
diff changeset
433
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
434 acc_prof_info prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
435 acc_api_info api_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
436 bool profiling_p = GOACC_PROFILING_SETUP_P (thr, &prof_info, &api_info);
111
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 splay_tree_key n = lookup_host (acc_dev, h, 1);
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 if (!n)
kono
parents:
diff changeset
443 {
kono
parents:
diff changeset
444 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
445 gomp_fatal ("%p is not a mapped block", (void *)h);
kono
parents:
diff changeset
446 }
kono
parents:
diff changeset
447
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
448 size_t host_size = n->host_end - n->host_start;
111
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 if (n->host_start != (uintptr_t) h)
kono
parents:
diff changeset
451 {
kono
parents:
diff changeset
452 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
453 gomp_fatal ("[%p,%d] surrounds %p",
kono
parents:
diff changeset
454 (void *) n->host_start, (int) host_size, (void *) h);
kono
parents:
diff changeset
455 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
456 /* TODO This currently doesn't catch 'REFCOUNT_INFINITY' usage different from
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
457 'acc_map_data'. Maybe 'virtual_refcount' can be used for disambiguating
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
458 the different 'REFCOUNT_INFINITY' cases, or simply separate
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
459 'REFCOUNT_INFINITY' values per different usage ('REFCOUNT_ACC_MAP_DATA'
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
460 etc.)? */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
461 else if (n->refcount != REFCOUNT_INFINITY)
111
kono
parents:
diff changeset
462 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
463 gomp_mutex_unlock (&acc_dev->lock);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
464 gomp_fatal ("refusing to unmap block [%p,+%d] that has not been mapped"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
465 " by 'acc_map_data'",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
466 (void *) h, (int) host_size);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
467 }
111
kono
parents:
diff changeset
468
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
469 splay_tree_remove (&acc_dev->mem_map, n);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
470
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
471 struct target_mem_desc *tgt = n->tgt;
111
kono
parents:
diff changeset
472
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
473 if (tgt->refcount == REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
474 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
475 gomp_mutex_unlock (&acc_dev->lock);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
476 gomp_fatal ("cannot unmap target block");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
477 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
478 else if (tgt->refcount > 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
479 tgt->refcount--;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
480 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
481 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
482 free (tgt->array);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
483 free (tgt);
111
kono
parents:
diff changeset
484 }
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
487
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
488 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
489 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
490 thr->prof_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
491 thr->api_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
492 }
111
kono
parents:
diff changeset
493 }
kono
parents:
diff changeset
494
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
495
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
496 /* Enter dynamic mapping for a single datum. Return the device pointer. */
111
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 static void *
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
499 goacc_enter_datum (void **hostaddrs, size_t *sizes, void *kinds, int async)
111
kono
parents:
diff changeset
500 {
kono
parents:
diff changeset
501 void *d;
kono
parents:
diff changeset
502 splay_tree_key n;
kono
parents:
diff changeset
503
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
504 if (!hostaddrs[0] || !sizes[0])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
505 gomp_fatal ("[%p,+%d] is a bad range", hostaddrs[0], (int) sizes[0]);
111
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 goacc_lazy_initialize ();
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
510 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
513 return hostaddrs[0];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
514
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
515 acc_prof_info prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
516 acc_api_info api_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
517 bool profiling_p = GOACC_PROFILING_SETUP_P (thr, &prof_info, &api_info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
518 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
519 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
520 prof_info.async = async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
521 prof_info.async_queue = prof_info.async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
522 }
111
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
525
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
526 n = lookup_host (acc_dev, hostaddrs[0], sizes[0]);
111
kono
parents:
diff changeset
527 if (n)
kono
parents:
diff changeset
528 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
529 void *h = hostaddrs[0];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
530 size_t s = sizes[0];
111
kono
parents:
diff changeset
531
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
532 /* Present. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
533 d = (void *) (n->tgt->tgt_start + n->tgt_offset + h - n->host_start);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
534
111
kono
parents:
diff changeset
535 if ((h + s) > (void *)n->host_end)
kono
parents:
diff changeset
536 {
kono
parents:
diff changeset
537 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
538 gomp_fatal ("[%p,+%d] not mapped", (void *)h, (int)s);
kono
parents:
diff changeset
539 }
kono
parents:
diff changeset
540
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
541 assert (n->refcount != REFCOUNT_LINK);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
542 if (n->refcount != REFCOUNT_INFINITY)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
543 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
544 n->refcount++;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
545 n->virtual_refcount++;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
546 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
547
111
kono
parents:
diff changeset
548 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
549 }
kono
parents:
diff changeset
550 else
kono
parents:
diff changeset
551 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
552 const size_t mapnum = 1;
111
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
555
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
556 goacc_aq aq = get_goacc_asyncqueue (async);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
557
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
558 gomp_map_vars_async (acc_dev, aq, mapnum, hostaddrs, NULL, sizes, kinds,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
559 true, GOMP_MAP_VARS_OPENACC_ENTER_DATA);
111
kono
parents:
diff changeset
560
kono
parents:
diff changeset
561 gomp_mutex_lock (&acc_dev->lock);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
562 n = lookup_host (acc_dev, hostaddrs[0], sizes[0]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
563 assert (n != NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
564 assert (n->tgt_offset == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
565 assert ((uintptr_t) hostaddrs[0] == n->host_start);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
566 d = (void *) n->tgt->tgt_start;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
567 gomp_mutex_unlock (&acc_dev->lock);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
568 }
111
kono
parents:
diff changeset
569
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
570 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
571 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
572 thr->prof_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
573 thr->api_info = NULL;
111
kono
parents:
diff changeset
574 }
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 return d;
kono
parents:
diff changeset
577 }
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 void *
kono
parents:
diff changeset
580 acc_create (void *h, size_t s)
kono
parents:
diff changeset
581 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
582 unsigned short kinds[1] = { GOMP_MAP_ALLOC };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
583 return goacc_enter_datum (&h, &s, &kinds, acc_async_sync);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
584 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
585
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
586 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
587 acc_create_async (void *h, size_t s, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
588 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
589 unsigned short kinds[1] = { GOMP_MAP_ALLOC };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
590 goacc_enter_datum (&h, &s, &kinds, async);
111
kono
parents:
diff changeset
591 }
kono
parents:
diff changeset
592
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
593 /* acc_present_or_create used to be what acc_create is now. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
594 /* acc_pcreate is acc_present_or_create by a different name. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
595 #ifdef HAVE_ATTRIBUTE_ALIAS
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
596 strong_alias (acc_create, acc_present_or_create)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
597 strong_alias (acc_create, acc_pcreate)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
598 #else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
599 void *
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
600 acc_present_or_create (void *h, size_t s)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
601 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
602 return acc_create (h, s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
603 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
604
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
605 void *
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
606 acc_pcreate (void *h, size_t s)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
607 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
608 return acc_create (h, s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
609 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
610 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
611
111
kono
parents:
diff changeset
612 void *
kono
parents:
diff changeset
613 acc_copyin (void *h, size_t s)
kono
parents:
diff changeset
614 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
615 unsigned short kinds[1] = { GOMP_MAP_TO };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
616 return goacc_enter_datum (&h, &s, &kinds, acc_async_sync);
111
kono
parents:
diff changeset
617 }
kono
parents:
diff changeset
618
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
619 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
620 acc_copyin_async (void *h, size_t s, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
621 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
622 unsigned short kinds[1] = { GOMP_MAP_TO };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
623 goacc_enter_datum (&h, &s, &kinds, async);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
624 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
625
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
626 /* acc_present_or_copyin used to be what acc_copyin is now. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
627 /* acc_pcopyin is acc_present_or_copyin by a different name. */
111
kono
parents:
diff changeset
628 #ifdef HAVE_ATTRIBUTE_ALIAS
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
629 strong_alias (acc_copyin, acc_present_or_copyin)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
630 strong_alias (acc_copyin, acc_pcopyin)
111
kono
parents:
diff changeset
631 #else
kono
parents:
diff changeset
632 void *
kono
parents:
diff changeset
633 acc_present_or_copyin (void *h, size_t s)
kono
parents:
diff changeset
634 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
635 return acc_copyin (h, s);
111
kono
parents:
diff changeset
636 }
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 void *
kono
parents:
diff changeset
639 acc_pcopyin (void *h, size_t s)
kono
parents:
diff changeset
640 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
641 return acc_copyin (h, s);
111
kono
parents:
diff changeset
642 }
kono
parents:
diff changeset
643 #endif
kono
parents:
diff changeset
644
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
645
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
646 /* Exit a dynamic mapping for a single variable. */
111
kono
parents:
diff changeset
647
kono
parents:
diff changeset
648 static void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
649 goacc_exit_datum (void *h, size_t s, unsigned short kind, int async)
111
kono
parents:
diff changeset
650 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
651 /* No need to call lazy open, as the data must already have been
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
652 mapped. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
653
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
654 kind &= 0xff;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
655
111
kono
parents:
diff changeset
656 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
657 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
658
kono
parents:
diff changeset
659 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
660 return;
kono
parents:
diff changeset
661
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
662 acc_prof_info prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
663 acc_api_info api_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
664 bool profiling_p = GOACC_PROFILING_SETUP_P (thr, &prof_info, &api_info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
665 if (profiling_p)
111
kono
parents:
diff changeset
666 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
667 prof_info.async = async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
668 prof_info.async_queue = prof_info.async;
111
kono
parents:
diff changeset
669 }
kono
parents:
diff changeset
670
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
671 gomp_mutex_lock (&acc_dev->lock);
111
kono
parents:
diff changeset
672
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
673 splay_tree_key n = lookup_host (acc_dev, h, s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
674 if (!n)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
675 /* PR92726, RP92970, PR92984: no-op. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
676 goto out;
111
kono
parents:
diff changeset
677
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
678 if ((uintptr_t) h < n->host_start || (uintptr_t) h + s > n->host_end)
111
kono
parents:
diff changeset
679 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
680 size_t host_size = n->host_end - n->host_start;
111
kono
parents:
diff changeset
681 gomp_mutex_unlock (&acc_dev->lock);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
682 gomp_fatal ("[%p,+%d] outside mapped block [%p,+%d]",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
683 (void *) h, (int) s, (void *) n->host_start, (int) host_size);
111
kono
parents:
diff changeset
684 }
kono
parents:
diff changeset
685
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
686 bool finalize = (kind == GOMP_MAP_DELETE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
687 || kind == GOMP_MAP_FORCE_FROM);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
688 if (finalize)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
689 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
690 if (n->refcount != REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
691 n->refcount -= n->virtual_refcount;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
692 n->virtual_refcount = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
693 }
111
kono
parents:
diff changeset
694
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
695 if (n->virtual_refcount > 0)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
696 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
697 if (n->refcount != REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
698 n->refcount--;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
699 n->virtual_refcount--;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
700 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
701 else if (n->refcount > 0 && n->refcount != REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
702 n->refcount--;
111
kono
parents:
diff changeset
703
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
704 if (n->refcount == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
705 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
706 goacc_aq aq = get_goacc_asyncqueue (async);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
707
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
708 bool copyout = (kind == GOMP_MAP_FROM
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
709 || kind == GOMP_MAP_FORCE_FROM);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
710 if (copyout)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
711 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
712 void *d = (void *) (n->tgt->tgt_start + n->tgt_offset
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
713 + (uintptr_t) h - n->host_start);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
714 gomp_copy_dev2host (acc_dev, aq, h, d, s);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
715 }
111
kono
parents:
diff changeset
716
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
717 if (aq)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
718 /* TODO We can't do the 'is_tgt_unmapped' checking -- see the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
719 'gomp_unref_tgt' comment in
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
720 <http://mid.mail-archive.com/878snl36eu.fsf@euler.schwinge.homeip.net>;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
721 PR92881. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
722 gomp_remove_var_async (acc_dev, n, aq);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
723 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
724 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
725 bool is_tgt_unmapped = gomp_remove_var (acc_dev, n);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
726 assert (is_tgt_unmapped);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
727 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
728 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
729
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
730 out:
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
731 gomp_mutex_unlock (&acc_dev->lock);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
732
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
733 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
734 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
735 thr->prof_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
736 thr->api_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
737 }
111
kono
parents:
diff changeset
738 }
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 void
kono
parents:
diff changeset
741 acc_delete (void *h , size_t s)
kono
parents:
diff changeset
742 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
743 goacc_exit_datum (h, s, GOMP_MAP_RELEASE, acc_async_sync);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
744 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
745
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
746 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
747 acc_delete_async (void *h , size_t s, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
748 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
749 goacc_exit_datum (h, s, GOMP_MAP_RELEASE, async);
111
kono
parents:
diff changeset
750 }
kono
parents:
diff changeset
751
kono
parents:
diff changeset
752 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
753 acc_delete_finalize (void *h , size_t s)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
754 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
755 goacc_exit_datum (h, s, GOMP_MAP_DELETE, acc_async_sync);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
756 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
757
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
758 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
759 acc_delete_finalize_async (void *h , size_t s, int async)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
760 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
761 goacc_exit_datum (h, s, GOMP_MAP_DELETE, async);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
762 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
763
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764 void
111
kono
parents:
diff changeset
765 acc_copyout (void *h, size_t s)
kono
parents:
diff changeset
766 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
767 goacc_exit_datum (h, s, GOMP_MAP_FROM, acc_async_sync);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
768 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
769
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
771 acc_copyout_async (void *h, size_t s, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
772 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
773 goacc_exit_datum (h, s, GOMP_MAP_FROM, async);
111
kono
parents:
diff changeset
774 }
kono
parents:
diff changeset
775
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
776 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
777 acc_copyout_finalize (void *h, size_t s)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
778 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
779 goacc_exit_datum (h, s, GOMP_MAP_FORCE_FROM, acc_async_sync);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
780 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
781
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
783 acc_copyout_finalize_async (void *h, size_t s, int async)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
785 goacc_exit_datum (h, s, GOMP_MAP_FORCE_FROM, async);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
787
111
kono
parents:
diff changeset
788 static void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
789 update_dev_host (int is_dev, void *h, size_t s, int async)
111
kono
parents:
diff changeset
790 {
kono
parents:
diff changeset
791 splay_tree_key n;
kono
parents:
diff changeset
792 void *d;
kono
parents:
diff changeset
793
kono
parents:
diff changeset
794 goacc_lazy_initialize ();
kono
parents:
diff changeset
795
kono
parents:
diff changeset
796 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
797 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
798
kono
parents:
diff changeset
799 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
800 return;
kono
parents:
diff changeset
801
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
802 /* Fortran optional arguments that are non-present result in a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
803 NULL host address here. This can safely be ignored as it is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
804 not possible to 'update' a non-present optional argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
805 if (h == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
806 return;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
807
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
808 acc_prof_info prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
809 acc_api_info api_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
810 bool profiling_p = GOACC_PROFILING_SETUP_P (thr, &prof_info, &api_info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
811 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
812 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
813 prof_info.async = async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
814 prof_info.async_queue = prof_info.async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
815 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
816
111
kono
parents:
diff changeset
817 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 n = lookup_host (acc_dev, h, s);
kono
parents:
diff changeset
820
kono
parents:
diff changeset
821 if (!n)
kono
parents:
diff changeset
822 {
kono
parents:
diff changeset
823 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
824 gomp_fatal ("[%p,%d] is not mapped", h, (int)s);
kono
parents:
diff changeset
825 }
kono
parents:
diff changeset
826
kono
parents:
diff changeset
827 d = (void *) (n->tgt->tgt_start + n->tgt_offset
kono
parents:
diff changeset
828 + (uintptr_t) h - n->host_start);
kono
parents:
diff changeset
829
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
830 goacc_aq aq = get_goacc_asyncqueue (async);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
831
111
kono
parents:
diff changeset
832 if (is_dev)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
833 gomp_copy_host2dev (acc_dev, aq, d, h, s, /* TODO: cbuf? */ NULL);
111
kono
parents:
diff changeset
834 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
835 gomp_copy_dev2host (acc_dev, aq, h, d, s);
111
kono
parents:
diff changeset
836
kono
parents:
diff changeset
837 gomp_mutex_unlock (&acc_dev->lock);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
838
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
839 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
840 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
841 thr->prof_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
842 thr->api_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
843 }
111
kono
parents:
diff changeset
844 }
kono
parents:
diff changeset
845
kono
parents:
diff changeset
846 void
kono
parents:
diff changeset
847 acc_update_device (void *h, size_t s)
kono
parents:
diff changeset
848 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
849 update_dev_host (1, h, s, acc_async_sync);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
850 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
851
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
852 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
853 acc_update_device_async (void *h, size_t s, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
854 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
855 update_dev_host (1, h, s, async);
111
kono
parents:
diff changeset
856 }
kono
parents:
diff changeset
857
kono
parents:
diff changeset
858 void
kono
parents:
diff changeset
859 acc_update_self (void *h, size_t s)
kono
parents:
diff changeset
860 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
861 update_dev_host (0, h, s, acc_async_sync);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
862 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
863
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
864 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
865 acc_update_self_async (void *h, size_t s, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
866 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
867 update_dev_host (0, h, s, async);
111
kono
parents:
diff changeset
868 }
kono
parents:
diff changeset
869
kono
parents:
diff changeset
870 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
871 acc_attach_async (void **hostaddr, int async)
111
kono
parents:
diff changeset
872 {
kono
parents:
diff changeset
873 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
874 struct gomp_device_descr *acc_dev = thr->dev;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
875 goacc_aq aq = get_goacc_asyncqueue (async);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
876
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
877 struct splay_tree_key_s cur_node;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
878 splay_tree_key n;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
879
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
880 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
881 return;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
882
111
kono
parents:
diff changeset
883 gomp_mutex_lock (&acc_dev->lock);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
884
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
885 cur_node.host_start = (uintptr_t) hostaddr;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
886 cur_node.host_end = cur_node.host_start + sizeof (void *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
887 n = splay_tree_lookup (&acc_dev->mem_map, &cur_node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
888
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
889 if (n == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
890 gomp_fatal ("struct not mapped for acc_attach");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
891
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
892 gomp_attach_pointer (acc_dev, aq, &acc_dev->mem_map, n, (uintptr_t) hostaddr,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
893 0, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
894
111
kono
parents:
diff changeset
895 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
896 }
kono
parents:
diff changeset
897
kono
parents:
diff changeset
898 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
899 acc_attach (void **hostaddr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
900 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
901 acc_attach_async (hostaddr, acc_async_sync);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
902 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
903
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
904 static void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
905 goacc_detach_internal (void **hostaddr, int async, bool finalize)
111
kono
parents:
diff changeset
906 {
kono
parents:
diff changeset
907 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
908 struct gomp_device_descr *acc_dev = thr->dev;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
909 struct splay_tree_key_s cur_node;
111
kono
parents:
diff changeset
910 splay_tree_key n;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
911 struct goacc_asyncqueue *aq = get_goacc_asyncqueue (async);
111
kono
parents:
diff changeset
912
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
913 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
914 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
915
111
kono
parents:
diff changeset
916 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
917
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
918 cur_node.host_start = (uintptr_t) hostaddr;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
919 cur_node.host_end = cur_node.host_start + sizeof (void *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
920 n = splay_tree_lookup (&acc_dev->mem_map, &cur_node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
921
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
922 if (n == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
923 gomp_fatal ("struct not mapped for acc_detach");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
924
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
925 gomp_detach_pointer (acc_dev, aq, n, (uintptr_t) hostaddr, finalize, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
926
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
927 gomp_mutex_unlock (&acc_dev->lock);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
928 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
929
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
930 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
931 acc_detach (void **hostaddr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
932 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
933 goacc_detach_internal (hostaddr, acc_async_sync, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
934 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
935
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
936 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
937 acc_detach_async (void **hostaddr, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
938 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
939 goacc_detach_internal (hostaddr, async, false);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
940 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
941
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
942 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
943 acc_detach_finalize (void **hostaddr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
944 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
945 goacc_detach_internal (hostaddr, acc_async_sync, true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
946 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
947
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
948 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
949 acc_detach_finalize_async (void **hostaddr, int async)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
950 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
951 goacc_detach_internal (hostaddr, async, true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
952 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
953
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
954 /* Some types of (pointer) variables use several consecutive mappings, which
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
955 must be treated as a group for enter/exit data directives. This function
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
956 returns the last mapping in such a group (inclusive), or POS for singleton
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
957 mappings. */
111
kono
parents:
diff changeset
958
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
959 static int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
960 find_group_last (int pos, size_t mapnum, size_t *sizes, unsigned short *kinds)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
961 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
962 unsigned char kind0 = kinds[pos] & 0xff;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
963 int first_pos = pos;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
964
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
965 switch (kind0)
111
kono
parents:
diff changeset
966 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
967 case GOMP_MAP_TO_PSET:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
968 while (pos + 1 < mapnum && (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
969 pos++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
970 /* We expect at least one GOMP_MAP_POINTER after a GOMP_MAP_TO_PSET. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
971 assert (pos > first_pos);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
972 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
973
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
974 case GOMP_MAP_STRUCT:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
975 pos += sizes[pos];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
976 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
977
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
978 case GOMP_MAP_POINTER:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
979 case GOMP_MAP_ALWAYS_POINTER:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
980 /* These mappings are only expected after some other mapping. If we
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
981 see one by itself, something has gone wrong. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
982 gomp_fatal ("unexpected mapping");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
983 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
984
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
985 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
986 /* GOMP_MAP_ALWAYS_POINTER can only appear directly after some other
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
987 mapping. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
988 if (pos + 1 < mapnum)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
989 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
990 unsigned char kind1 = kinds[pos + 1] & 0xff;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
991 if (kind1 == GOMP_MAP_ALWAYS_POINTER)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
992 return pos + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
993 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
994
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
995 /* We can have zero or more GOMP_MAP_POINTER mappings after a to/from
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
996 (etc.) mapping. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
997 while (pos + 1 < mapnum && (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
998 pos++;
111
kono
parents:
diff changeset
999 }
kono
parents:
diff changeset
1000
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1001 return pos;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1002 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1003
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1004 /* Map variables for OpenACC "enter data". We can't just call
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1005 gomp_map_vars_async once, because individual mapped variables might have
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1006 "exit data" called for them at different times. */
111
kono
parents:
diff changeset
1007
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1008 static void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1009 goacc_enter_data_internal (struct gomp_device_descr *acc_dev, size_t mapnum,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1010 void **hostaddrs, size_t *sizes,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1011 unsigned short *kinds, goacc_aq aq)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1012 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1013 for (size_t i = 0; i < mapnum; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1014 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1015 int group_last = find_group_last (i, mapnum, sizes, kinds);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1016
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1017 gomp_map_vars_async (acc_dev, aq,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1018 (group_last - i) + 1,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1019 &hostaddrs[i], NULL,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1020 &sizes[i], &kinds[i], true,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1021 GOMP_MAP_VARS_OPENACC_ENTER_DATA);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1022
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1023 i = group_last;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1024 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1025 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1026
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1027 /* Unmap variables for OpenACC "exit data". */
111
kono
parents:
diff changeset
1028
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1029 static void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1030 goacc_exit_data_internal (struct gomp_device_descr *acc_dev, size_t mapnum,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1031 void **hostaddrs, size_t *sizes,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1032 unsigned short *kinds, goacc_aq aq)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1033 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1034 gomp_mutex_lock (&acc_dev->lock);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1035
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1036 /* Handle "detach" before copyback/deletion of mapped data. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1037 for (size_t i = 0; i < mapnum; ++i)
111
kono
parents:
diff changeset
1038 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1039 unsigned char kind = kinds[i] & 0xff;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1040 bool finalize = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1041 switch (kind)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1042 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1043 case GOMP_MAP_FORCE_DETACH:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1044 finalize = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1045 /* Fallthrough. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1046
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1047 case GOMP_MAP_DETACH:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1048 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1049 struct splay_tree_key_s cur_node;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1050 uintptr_t hostaddr = (uintptr_t) hostaddrs[i];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1051 cur_node.host_start = hostaddr;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1052 cur_node.host_end = cur_node.host_start + sizeof (void *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1053 splay_tree_key n
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1054 = splay_tree_lookup (&acc_dev->mem_map, &cur_node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1055
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1056 if (n == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1057 gomp_fatal ("struct not mapped for detach operation");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1058
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1059 gomp_detach_pointer (acc_dev, aq, n, hostaddr, finalize, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1060 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1061 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1062 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1063 ;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1064 }
111
kono
parents:
diff changeset
1065 }
kono
parents:
diff changeset
1066
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1067 for (size_t i = 0; i < mapnum; ++i)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1068 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1069 unsigned char kind = kinds[i] & 0xff;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1070 bool copyfrom = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1071 bool finalize = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1072
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1073 if (kind == GOMP_MAP_FORCE_FROM
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1074 || kind == GOMP_MAP_DELETE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1075 || kind == GOMP_MAP_FORCE_DETACH)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1076 finalize = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1077
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1078 switch (kind)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1079 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1080 case GOMP_MAP_FROM:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1081 case GOMP_MAP_FORCE_FROM:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1082 case GOMP_MAP_ALWAYS_FROM:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1083 copyfrom = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1084 /* Fallthrough. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1085
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1086 case GOMP_MAP_TO_PSET:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1087 case GOMP_MAP_POINTER:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1088 case GOMP_MAP_DELETE:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1089 case GOMP_MAP_RELEASE:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1090 case GOMP_MAP_DETACH:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1091 case GOMP_MAP_FORCE_DETACH:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1092 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1093 struct splay_tree_key_s cur_node;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1094 size_t size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1095 if (kind == GOMP_MAP_POINTER
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1096 || kind == GOMP_MAP_DETACH
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1097 || kind == GOMP_MAP_FORCE_DETACH)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1098 size = sizeof (void *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1099 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1100 size = sizes[i];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1101 cur_node.host_start = (uintptr_t) hostaddrs[i];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1102 cur_node.host_end = cur_node.host_start + size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1103 splay_tree_key n
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1104 = splay_tree_lookup (&acc_dev->mem_map, &cur_node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1105
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1106 if (n == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1107 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1108
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1109 if (finalize)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1110 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1111 if (n->refcount != REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1112 n->refcount -= n->virtual_refcount;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1113 n->virtual_refcount = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1114 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1115
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1116 if (n->virtual_refcount > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1117 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1118 if (n->refcount != REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1119 n->refcount--;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1120 n->virtual_refcount--;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1121 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1122 else if (n->refcount > 0 && n->refcount != REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1123 n->refcount--;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1124
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1125 if (copyfrom
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1126 && (kind != GOMP_MAP_FROM || n->refcount == 0))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1127 gomp_copy_dev2host (acc_dev, aq, (void *) cur_node.host_start,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1128 (void *) (n->tgt->tgt_start + n->tgt_offset
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1129 + cur_node.host_start
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1130 - n->host_start),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1131 cur_node.host_end - cur_node.host_start);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1132
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1133 if (n->refcount == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1134 gomp_remove_var_async (acc_dev, n, aq);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1135 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1136 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1137
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1138 case GOMP_MAP_STRUCT:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1139 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1140 int elems = sizes[i];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1141 for (int j = 1; j <= elems; j++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1142 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1143 struct splay_tree_key_s k;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1144 k.host_start = (uintptr_t) hostaddrs[i + j];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1145 k.host_end = k.host_start + sizes[i + j];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1146 splay_tree_key str;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1147 str = splay_tree_lookup (&acc_dev->mem_map, &k);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1148 if (str)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1149 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1150 if (finalize)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1151 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1152 if (str->refcount != REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1153 str->refcount -= str->virtual_refcount;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1154 str->virtual_refcount = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1155 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1156 if (str->virtual_refcount > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1157 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1158 if (str->refcount != REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1159 str->refcount--;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1160 str->virtual_refcount--;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1161 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1162 else if (str->refcount > 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1163 && str->refcount != REFCOUNT_INFINITY)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1164 str->refcount--;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1165 if (str->refcount == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1166 gomp_remove_var_async (acc_dev, str, aq);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1167 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1168 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1169 i += elems;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1170 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1171 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1172
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1173 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1174 gomp_fatal (">>>> goacc_exit_data_internal UNHANDLED kind 0x%.2x",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1175 kind);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1176 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1177 }
111
kono
parents:
diff changeset
1178
kono
parents:
diff changeset
1179 gomp_mutex_unlock (&acc_dev->lock);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1180 }
111
kono
parents:
diff changeset
1181
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1182 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1183 GOACC_enter_exit_data (int flags_m, size_t mapnum, void **hostaddrs,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1184 size_t *sizes, unsigned short *kinds, int async,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1185 int num_waits, ...)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1186 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1187 int flags = GOACC_FLAGS_UNMARSHAL (flags_m);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1188
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1189 struct goacc_thread *thr;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1190 struct gomp_device_descr *acc_dev;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1191 bool data_enter = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1192 size_t i;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1193
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1194 goacc_lazy_initialize ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1195
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1196 thr = goacc_thread ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1197 acc_dev = thr->dev;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1198
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1199 /* Determine if this is an "acc enter data". */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1200 for (i = 0; i < mapnum; ++i)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1201 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1202 unsigned char kind = kinds[i] & 0xff;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1203
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1204 if (kind == GOMP_MAP_POINTER
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1205 || kind == GOMP_MAP_TO_PSET
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1206 || kind == GOMP_MAP_STRUCT)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1207 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1208
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1209 if (kind == GOMP_MAP_FORCE_ALLOC
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1210 || kind == GOMP_MAP_FORCE_PRESENT
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1211 || kind == GOMP_MAP_ATTACH
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1212 || kind == GOMP_MAP_FORCE_TO
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1213 || kind == GOMP_MAP_TO
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1214 || kind == GOMP_MAP_ALLOC)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1215 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1216 data_enter = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1217 break;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1218 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1219
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1220 if (kind == GOMP_MAP_RELEASE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1221 || kind == GOMP_MAP_DELETE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1222 || kind == GOMP_MAP_DETACH
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1223 || kind == GOMP_MAP_FORCE_DETACH
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1224 || kind == GOMP_MAP_FROM
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1225 || kind == GOMP_MAP_FORCE_FROM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1226 break;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1227
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1228 gomp_fatal (">>>> GOACC_enter_exit_data UNHANDLED kind 0x%.2x",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1229 kind);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1230 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1231
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1232 bool profiling_p = GOACC_PROFILING_DISPATCH_P (true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1233
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1234 acc_prof_info prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1235 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1236 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1237 thr->prof_info = &prof_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1238
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1239 prof_info.event_type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1240 = data_enter ? acc_ev_enter_data_start : acc_ev_exit_data_start;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1241 prof_info.valid_bytes = _ACC_PROF_INFO_VALID_BYTES;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1242 prof_info.version = _ACC_PROF_INFO_VERSION;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1243 prof_info.device_type = acc_device_type (acc_dev->type);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1244 prof_info.device_number = acc_dev->target_id;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1245 prof_info.thread_id = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1246 prof_info.async = async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1247 prof_info.async_queue = prof_info.async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1248 prof_info.src_file = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1249 prof_info.func_name = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1250 prof_info.line_no = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1251 prof_info.end_line_no = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1252 prof_info.func_line_no = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1253 prof_info.func_end_line_no = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1254 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1255 acc_event_info enter_exit_data_event_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1256 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1257 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1258 enter_exit_data_event_info.other_event.event_type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1259 = prof_info.event_type;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1260 enter_exit_data_event_info.other_event.valid_bytes
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1261 = _ACC_OTHER_EVENT_INFO_VALID_BYTES;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1262 enter_exit_data_event_info.other_event.parent_construct
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1263 = data_enter ? acc_construct_enter_data : acc_construct_exit_data;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1264 enter_exit_data_event_info.other_event.implicit = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1265 enter_exit_data_event_info.other_event.tool_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1266 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1267 acc_api_info api_info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1268 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1269 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1270 thr->api_info = &api_info;
111
kono
parents:
diff changeset
1271
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1272 api_info.device_api = acc_device_api_none;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1273 api_info.valid_bytes = _ACC_API_INFO_VALID_BYTES;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1274 api_info.device_type = prof_info.device_type;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1275 api_info.vendor = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1276 api_info.device_handle = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1277 api_info.context_handle = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1278 api_info.async_handle = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1279 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1280
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1281 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1282 goacc_profiling_dispatch (&prof_info, &enter_exit_data_event_info,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1283 &api_info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1284
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1285 if ((acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1286 || (flags & GOACC_FLAG_HOST_FALLBACK))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1287 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1288 prof_info.device_type = acc_device_host;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1289 api_info.device_type = prof_info.device_type;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1290
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1291 goto out_prof;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1292 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1293
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1294 if (num_waits)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1295 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1296 va_list ap;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1297
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1298 va_start (ap, num_waits);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1299 goacc_wait (async, num_waits, &ap);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1300 va_end (ap);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1301 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1302
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1303 goacc_aq aq = get_goacc_asyncqueue (async);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1304
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1305 if (data_enter)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1306 goacc_enter_data_internal (acc_dev, mapnum, hostaddrs, sizes, kinds, aq);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1307 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1308 goacc_exit_data_internal (acc_dev, mapnum, hostaddrs, sizes, kinds, aq);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1309
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1310 out_prof:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1311 if (profiling_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1312 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1313 prof_info.event_type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1314 = data_enter ? acc_ev_enter_data_end : acc_ev_exit_data_end;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1315 enter_exit_data_event_info.other_event.event_type = prof_info.event_type;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1316 goacc_profiling_dispatch (&prof_info, &enter_exit_data_event_info,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1317 &api_info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1318
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1319 thr->prof_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1320 thr->api_info = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1321 }
111
kono
parents:
diff changeset
1322 }