annotate libgomp/oacc-mem.c @ 138:fc828634a951

merge
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 08 Nov 2018 14:17:14 +0900
parents 84e7813d76e9
children 1830386684a0
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
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3 Copyright (C) 2013-2018 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 "config.h"
kono
parents:
diff changeset
31 #include "libgomp.h"
kono
parents:
diff changeset
32 #include "gomp-constants.h"
kono
parents:
diff changeset
33 #include "oacc-int.h"
kono
parents:
diff changeset
34 #include <stdint.h>
kono
parents:
diff changeset
35 #include <string.h>
kono
parents:
diff changeset
36 #include <assert.h>
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 /* Return block containing [H->S), or NULL if not contained. The device lock
kono
parents:
diff changeset
39 for DEV must be locked on entry, and remains locked on exit. */
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 static splay_tree_key
kono
parents:
diff changeset
42 lookup_host (struct gomp_device_descr *dev, void *h, size_t s)
kono
parents:
diff changeset
43 {
kono
parents:
diff changeset
44 struct splay_tree_key_s node;
kono
parents:
diff changeset
45 splay_tree_key key;
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 node.host_start = (uintptr_t) h;
kono
parents:
diff changeset
48 node.host_end = (uintptr_t) h + s;
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 key = splay_tree_lookup (&dev->mem_map, &node);
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 return key;
kono
parents:
diff changeset
53 }
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 /* Return block containing [D->S), or NULL if not contained.
kono
parents:
diff changeset
56 The list isn't ordered by device address, so we have to iterate
kono
parents:
diff changeset
57 over the whole array. This is not expected to be a common
kono
parents:
diff changeset
58 operation. The device lock associated with TGT must be locked on entry, and
kono
parents:
diff changeset
59 remains locked on exit. */
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 static splay_tree_key
kono
parents:
diff changeset
62 lookup_dev (struct target_mem_desc *tgt, void *d, size_t s)
kono
parents:
diff changeset
63 {
kono
parents:
diff changeset
64 int i;
kono
parents:
diff changeset
65 struct target_mem_desc *t;
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 if (!tgt)
kono
parents:
diff changeset
68 return NULL;
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 for (t = tgt; t != NULL; t = t->prev)
kono
parents:
diff changeset
71 {
kono
parents:
diff changeset
72 if (t->tgt_start <= (uintptr_t) d && t->tgt_end >= (uintptr_t) d + s)
kono
parents:
diff changeset
73 break;
kono
parents:
diff changeset
74 }
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 if (!t)
kono
parents:
diff changeset
77 return NULL;
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 for (i = 0; i < t->list_count; i++)
kono
parents:
diff changeset
80 {
kono
parents:
diff changeset
81 void * offset;
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 splay_tree_key k = &t->array[i].key;
kono
parents:
diff changeset
84 offset = d - t->tgt_start + k->tgt_offset;
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 if (k->host_start + offset <= (void *) k->host_end)
kono
parents:
diff changeset
87 return k;
kono
parents:
diff changeset
88 }
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 return NULL;
kono
parents:
diff changeset
91 }
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 /* OpenACC is silent on how memory exhaustion is indicated. We return
kono
parents:
diff changeset
94 NULL. */
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 void *
kono
parents:
diff changeset
97 acc_malloc (size_t s)
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 if (!s)
kono
parents:
diff changeset
100 return NULL;
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 goacc_lazy_initialize ();
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 assert (thr->dev);
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
109 return malloc (s);
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 return thr->dev->alloc_func (thr->dev->target_id, s);
kono
parents:
diff changeset
112 }
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 /* OpenACC 2.0a (3.2.16) doesn't specify what to do in the event
kono
parents:
diff changeset
115 the device address is mapped. We choose to check if it mapped,
kono
parents:
diff changeset
116 and if it is, to unmap it. */
kono
parents:
diff changeset
117 void
kono
parents:
diff changeset
118 acc_free (void *d)
kono
parents:
diff changeset
119 {
kono
parents:
diff changeset
120 splay_tree_key k;
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 if (!d)
kono
parents:
diff changeset
123 return;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 assert (thr && thr->dev);
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
132 return free (d);
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 /* We don't have to call lazy open here, as the ptr value must have
kono
parents:
diff changeset
137 been returned by acc_malloc. It's not permitted to pass NULL in
kono
parents:
diff changeset
138 (unless you got that null from acc_malloc). */
kono
parents:
diff changeset
139 if ((k = lookup_dev (acc_dev->openacc.data_environ, d, 1)))
kono
parents:
diff changeset
140 {
kono
parents:
diff changeset
141 void *offset;
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 offset = d - k->tgt->tgt_start + k->tgt_offset;
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 acc_unmap_data ((void *)(k->host_start + offset));
kono
parents:
diff changeset
148 }
kono
parents:
diff changeset
149 else
kono
parents:
diff changeset
150 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 if (!acc_dev->free_func (acc_dev->target_id, d))
kono
parents:
diff changeset
153 gomp_fatal ("error in freeing device memory in %s", __FUNCTION__);
kono
parents:
diff changeset
154 }
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 void
kono
parents:
diff changeset
157 acc_memcpy_to_device (void *d, void *h, size_t s)
kono
parents:
diff changeset
158 {
kono
parents:
diff changeset
159 /* No need to call lazy open here, as the device pointer must have
kono
parents:
diff changeset
160 been obtained from a routine that did that. */
kono
parents:
diff changeset
161 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 assert (thr && thr->dev);
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
166 {
kono
parents:
diff changeset
167 memmove (d, h, s);
kono
parents:
diff changeset
168 return;
kono
parents:
diff changeset
169 }
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 if (!thr->dev->host2dev_func (thr->dev->target_id, d, h, s))
kono
parents:
diff changeset
172 gomp_fatal ("error in %s", __FUNCTION__);
kono
parents:
diff changeset
173 }
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 void
kono
parents:
diff changeset
176 acc_memcpy_from_device (void *h, void *d, size_t s)
kono
parents:
diff changeset
177 {
kono
parents:
diff changeset
178 /* No need to call lazy open here, as the device pointer must have
kono
parents:
diff changeset
179 been obtained from a routine that did that. */
kono
parents:
diff changeset
180 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 assert (thr && thr->dev);
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
185 {
kono
parents:
diff changeset
186 memmove (h, d, s);
kono
parents:
diff changeset
187 return;
kono
parents:
diff changeset
188 }
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 if (!thr->dev->dev2host_func (thr->dev->target_id, h, d, s))
kono
parents:
diff changeset
191 gomp_fatal ("error in %s", __FUNCTION__);
kono
parents:
diff changeset
192 }
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 /* Return the device pointer that corresponds to host data H. Or NULL
kono
parents:
diff changeset
195 if no mapping. */
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 void *
kono
parents:
diff changeset
198 acc_deviceptr (void *h)
kono
parents:
diff changeset
199 {
kono
parents:
diff changeset
200 splay_tree_key n;
kono
parents:
diff changeset
201 void *d;
kono
parents:
diff changeset
202 void *offset;
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 goacc_lazy_initialize ();
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
207 struct gomp_device_descr *dev = thr->dev;
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
210 return h;
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 gomp_mutex_lock (&dev->lock);
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 n = lookup_host (dev, h, 1);
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 if (!n)
kono
parents:
diff changeset
217 {
kono
parents:
diff changeset
218 gomp_mutex_unlock (&dev->lock);
kono
parents:
diff changeset
219 return NULL;
kono
parents:
diff changeset
220 }
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 offset = h - n->host_start;
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 d = n->tgt->tgt_start + n->tgt_offset + offset;
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 gomp_mutex_unlock (&dev->lock);
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 return d;
kono
parents:
diff changeset
229 }
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 /* Return the host pointer that corresponds to device data D. Or NULL
kono
parents:
diff changeset
232 if no mapping. */
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 void *
kono
parents:
diff changeset
235 acc_hostptr (void *d)
kono
parents:
diff changeset
236 {
kono
parents:
diff changeset
237 splay_tree_key n;
kono
parents:
diff changeset
238 void *h;
kono
parents:
diff changeset
239 void *offset;
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 goacc_lazy_initialize ();
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
244 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
247 return d;
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 n = lookup_dev (acc_dev->openacc.data_environ, d, 1);
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 if (!n)
kono
parents:
diff changeset
254 {
kono
parents:
diff changeset
255 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
256 return NULL;
kono
parents:
diff changeset
257 }
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 offset = d - n->tgt->tgt_start + n->tgt_offset;
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 h = n->host_start + offset;
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 return h;
kono
parents:
diff changeset
266 }
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 /* Return 1 if host data [H,+S] is present on the device. */
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 int
kono
parents:
diff changeset
271 acc_is_present (void *h, size_t s)
kono
parents:
diff changeset
272 {
kono
parents:
diff changeset
273 splay_tree_key n;
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 if (!s || !h)
kono
parents:
diff changeset
276 return 0;
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 goacc_lazy_initialize ();
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
281 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
284 return h != NULL;
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 n = lookup_host (acc_dev, h, s);
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 if (n && ((uintptr_t)h < n->host_start
kono
parents:
diff changeset
291 || (uintptr_t)h + s > n->host_end
kono
parents:
diff changeset
292 || s > n->host_end - n->host_start))
kono
parents:
diff changeset
293 n = NULL;
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 return n != NULL;
kono
parents:
diff changeset
298 }
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 /* Create a mapping for host [H,+S] -> device [D,+S] */
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 void
kono
parents:
diff changeset
303 acc_map_data (void *h, void *d, size_t s)
kono
parents:
diff changeset
304 {
kono
parents:
diff changeset
305 struct target_mem_desc *tgt = NULL;
kono
parents:
diff changeset
306 size_t mapnum = 1;
kono
parents:
diff changeset
307 void *hostaddrs = h;
kono
parents:
diff changeset
308 void *devaddrs = d;
kono
parents:
diff changeset
309 size_t sizes = s;
kono
parents:
diff changeset
310 unsigned short kinds = GOMP_MAP_ALLOC;
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 goacc_lazy_initialize ();
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
315 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
318 {
kono
parents:
diff changeset
319 if (d != h)
kono
parents:
diff changeset
320 gomp_fatal ("cannot map data on shared-memory system");
kono
parents:
diff changeset
321 }
kono
parents:
diff changeset
322 else
kono
parents:
diff changeset
323 {
kono
parents:
diff changeset
324 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 if (!d || !h || !s)
kono
parents:
diff changeset
327 gomp_fatal ("[%p,+%d]->[%p,+%d] is a bad map",
kono
parents:
diff changeset
328 (void *)h, (int)s, (void *)d, (int)s);
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 if (lookup_host (acc_dev, h, s))
kono
parents:
diff changeset
333 {
kono
parents:
diff changeset
334 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
335 gomp_fatal ("host address [%p, +%d] is already mapped", (void *)h,
kono
parents:
diff changeset
336 (int)s);
kono
parents:
diff changeset
337 }
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 if (lookup_dev (thr->dev->openacc.data_environ, d, s))
kono
parents:
diff changeset
340 {
kono
parents:
diff changeset
341 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
342 gomp_fatal ("device address [%p, +%d] is already mapped", (void *)d,
kono
parents:
diff changeset
343 (int)s);
kono
parents:
diff changeset
344 }
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 tgt = gomp_map_vars (acc_dev, mapnum, &hostaddrs, &devaddrs, &sizes,
kono
parents:
diff changeset
349 &kinds, true, GOMP_MAP_VARS_OPENACC);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
350 tgt->list[0].key->refcount = REFCOUNT_INFINITY;
111
kono
parents:
diff changeset
351 }
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
354 tgt->prev = acc_dev->openacc.data_environ;
kono
parents:
diff changeset
355 acc_dev->openacc.data_environ = tgt;
kono
parents:
diff changeset
356 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
357 }
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 void
kono
parents:
diff changeset
360 acc_unmap_data (void *h)
kono
parents:
diff changeset
361 {
kono
parents:
diff changeset
362 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
363 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 /* No need to call lazy open, as the address must have been mapped. */
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 /* This is a no-op on shared-memory targets. */
kono
parents:
diff changeset
368 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
369 return;
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 size_t host_size;
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
374
kono
parents:
diff changeset
375 splay_tree_key n = lookup_host (acc_dev, h, 1);
kono
parents:
diff changeset
376 struct target_mem_desc *t;
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 if (!n)
kono
parents:
diff changeset
379 {
kono
parents:
diff changeset
380 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
381 gomp_fatal ("%p is not a mapped block", (void *)h);
kono
parents:
diff changeset
382 }
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 host_size = n->host_end - n->host_start;
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 if (n->host_start != (uintptr_t) h)
kono
parents:
diff changeset
387 {
kono
parents:
diff changeset
388 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
389 gomp_fatal ("[%p,%d] surrounds %p",
kono
parents:
diff changeset
390 (void *) n->host_start, (int) host_size, (void *) h);
kono
parents:
diff changeset
391 }
kono
parents:
diff changeset
392
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
393 /* Mark for removal. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
394 n->refcount = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
395
111
kono
parents:
diff changeset
396 t = n->tgt;
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 if (t->refcount == 2)
kono
parents:
diff changeset
399 {
kono
parents:
diff changeset
400 struct target_mem_desc *tp;
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 /* This is the last reference, so pull the descriptor off the
kono
parents:
diff changeset
403 chain. This avoids gomp_unmap_vars via gomp_unmap_tgt from
kono
parents:
diff changeset
404 freeing the device memory. */
kono
parents:
diff changeset
405 t->tgt_end = 0;
kono
parents:
diff changeset
406 t->to_free = 0;
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 for (tp = NULL, t = acc_dev->openacc.data_environ; t != NULL;
kono
parents:
diff changeset
409 tp = t, t = t->prev)
kono
parents:
diff changeset
410 if (n->tgt == t)
kono
parents:
diff changeset
411 {
kono
parents:
diff changeset
412 if (tp)
kono
parents:
diff changeset
413 tp->prev = t->prev;
kono
parents:
diff changeset
414 else
kono
parents:
diff changeset
415 acc_dev->openacc.data_environ = t->prev;
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 break;
kono
parents:
diff changeset
418 }
kono
parents:
diff changeset
419 }
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 gomp_unmap_vars (t, true);
kono
parents:
diff changeset
424 }
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 #define FLAG_PRESENT (1 << 0)
kono
parents:
diff changeset
427 #define FLAG_CREATE (1 << 1)
kono
parents:
diff changeset
428 #define FLAG_COPY (1 << 2)
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 static void *
kono
parents:
diff changeset
431 present_create_copy (unsigned f, void *h, size_t s)
kono
parents:
diff changeset
432 {
kono
parents:
diff changeset
433 void *d;
kono
parents:
diff changeset
434 splay_tree_key n;
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 if (!h || !s)
kono
parents:
diff changeset
437 gomp_fatal ("[%p,+%d] is a bad range", (void *)h, (int)s);
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 goacc_lazy_initialize ();
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
442 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
445 return h;
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 n = lookup_host (acc_dev, h, s);
kono
parents:
diff changeset
450 if (n)
kono
parents:
diff changeset
451 {
kono
parents:
diff changeset
452 /* Present. */
kono
parents:
diff changeset
453 d = (void *) (n->tgt->tgt_start + n->tgt_offset);
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 if (!(f & FLAG_PRESENT))
kono
parents:
diff changeset
456 {
kono
parents:
diff changeset
457 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
458 gomp_fatal ("[%p,+%d] already mapped to [%p,+%d]",
kono
parents:
diff changeset
459 (void *)h, (int)s, (void *)d, (int)s);
kono
parents:
diff changeset
460 }
kono
parents:
diff changeset
461 if ((h + s) > (void *)n->host_end)
kono
parents:
diff changeset
462 {
kono
parents:
diff changeset
463 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
464 gomp_fatal ("[%p,+%d] not mapped", (void *)h, (int)s);
kono
parents:
diff changeset
465 }
kono
parents:
diff changeset
466
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
467 if (n->refcount != REFCOUNT_INFINITY)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
468 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
469 n->refcount++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
470 n->dynamic_refcount++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
471 }
111
kono
parents:
diff changeset
472 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
473 }
kono
parents:
diff changeset
474 else if (!(f & FLAG_CREATE))
kono
parents:
diff changeset
475 {
kono
parents:
diff changeset
476 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
477 gomp_fatal ("[%p,+%d] not mapped", (void *)h, (int)s);
kono
parents:
diff changeset
478 }
kono
parents:
diff changeset
479 else
kono
parents:
diff changeset
480 {
kono
parents:
diff changeset
481 struct target_mem_desc *tgt;
kono
parents:
diff changeset
482 size_t mapnum = 1;
kono
parents:
diff changeset
483 unsigned short kinds;
kono
parents:
diff changeset
484 void *hostaddrs = h;
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 if (f & FLAG_COPY)
kono
parents:
diff changeset
487 kinds = GOMP_MAP_TO;
kono
parents:
diff changeset
488 else
kono
parents:
diff changeset
489 kinds = GOMP_MAP_ALLOC;
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 tgt = gomp_map_vars (acc_dev, mapnum, &hostaddrs, NULL, &s, &kinds, true,
kono
parents:
diff changeset
494 GOMP_MAP_VARS_OPENACC);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
495 /* Initialize dynamic refcount. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
496 tgt->list[0].key->dynamic_refcount = 1;
111
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 d = tgt->to_free;
kono
parents:
diff changeset
501 tgt->prev = acc_dev->openacc.data_environ;
kono
parents:
diff changeset
502 acc_dev->openacc.data_environ = tgt;
kono
parents:
diff changeset
503
kono
parents:
diff changeset
504 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
505 }
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 return d;
kono
parents:
diff changeset
508 }
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 void *
kono
parents:
diff changeset
511 acc_create (void *h, size_t s)
kono
parents:
diff changeset
512 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
513 return present_create_copy (FLAG_PRESENT | FLAG_CREATE, h, s);
111
kono
parents:
diff changeset
514 }
kono
parents:
diff changeset
515
kono
parents:
diff changeset
516 void *
kono
parents:
diff changeset
517 acc_copyin (void *h, size_t s)
kono
parents:
diff changeset
518 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
519 return present_create_copy (FLAG_PRESENT | FLAG_CREATE | FLAG_COPY, h, s);
111
kono
parents:
diff changeset
520 }
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 void *
kono
parents:
diff changeset
523 acc_present_or_create (void *h, size_t s)
kono
parents:
diff changeset
524 {
kono
parents:
diff changeset
525 return present_create_copy (FLAG_PRESENT | FLAG_CREATE, h, s);
kono
parents:
diff changeset
526 }
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 /* acc_pcreate is acc_present_or_create by a different name. */
kono
parents:
diff changeset
529 #ifdef HAVE_ATTRIBUTE_ALIAS
kono
parents:
diff changeset
530 strong_alias (acc_present_or_create, acc_pcreate)
kono
parents:
diff changeset
531 #else
kono
parents:
diff changeset
532 void *
kono
parents:
diff changeset
533 acc_pcreate (void *h, size_t s)
kono
parents:
diff changeset
534 {
kono
parents:
diff changeset
535 return acc_present_or_create (h, s);
kono
parents:
diff changeset
536 }
kono
parents:
diff changeset
537 #endif
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 void *
kono
parents:
diff changeset
540 acc_present_or_copyin (void *h, size_t s)
kono
parents:
diff changeset
541 {
kono
parents:
diff changeset
542 return present_create_copy (FLAG_PRESENT | FLAG_CREATE | FLAG_COPY, h, s);
kono
parents:
diff changeset
543 }
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 /* acc_pcopyin is acc_present_or_copyin by a different name. */
kono
parents:
diff changeset
546 #ifdef HAVE_ATTRIBUTE_ALIAS
kono
parents:
diff changeset
547 strong_alias (acc_present_or_copyin, acc_pcopyin)
kono
parents:
diff changeset
548 #else
kono
parents:
diff changeset
549 void *
kono
parents:
diff changeset
550 acc_pcopyin (void *h, size_t s)
kono
parents:
diff changeset
551 {
kono
parents:
diff changeset
552 return acc_present_or_copyin (h, s);
kono
parents:
diff changeset
553 }
kono
parents:
diff changeset
554 #endif
kono
parents:
diff changeset
555
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
556 #define FLAG_COPYOUT (1 << 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
557 #define FLAG_FINALIZE (1 << 1)
111
kono
parents:
diff changeset
558
kono
parents:
diff changeset
559 static void
kono
parents:
diff changeset
560 delete_copyout (unsigned f, void *h, size_t s, const char *libfnname)
kono
parents:
diff changeset
561 {
kono
parents:
diff changeset
562 size_t host_size;
kono
parents:
diff changeset
563 splay_tree_key n;
kono
parents:
diff changeset
564 void *d;
kono
parents:
diff changeset
565 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
566 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
569 return;
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
572
kono
parents:
diff changeset
573 n = lookup_host (acc_dev, h, s);
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 /* No need to call lazy open, as the data must already have been
kono
parents:
diff changeset
576 mapped. */
kono
parents:
diff changeset
577
kono
parents:
diff changeset
578 if (!n)
kono
parents:
diff changeset
579 {
kono
parents:
diff changeset
580 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
581 gomp_fatal ("[%p,%d] is not mapped", (void *)h, (int)s);
kono
parents:
diff changeset
582 }
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 d = (void *) (n->tgt->tgt_start + n->tgt_offset
kono
parents:
diff changeset
585 + (uintptr_t) h - n->host_start);
kono
parents:
diff changeset
586
kono
parents:
diff changeset
587 host_size = n->host_end - n->host_start;
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589 if (n->host_start != (uintptr_t) h || host_size != s)
kono
parents:
diff changeset
590 {
kono
parents:
diff changeset
591 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
592 gomp_fatal ("[%p,%d] surrounds2 [%p,+%d]",
kono
parents:
diff changeset
593 (void *) n->host_start, (int) host_size, (void *) h, (int) s);
kono
parents:
diff changeset
594 }
kono
parents:
diff changeset
595
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
596 if (n->refcount == REFCOUNT_INFINITY)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
597 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
598 n->refcount = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
599 n->dynamic_refcount = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
600 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
601 if (n->refcount < n->dynamic_refcount)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
602 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
603 gomp_mutex_unlock (&acc_dev->lock);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
604 gomp_fatal ("Dynamic reference counting assert fail\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
605 }
111
kono
parents:
diff changeset
606
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
607 if (f & FLAG_FINALIZE)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
608 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
609 n->refcount -= n->dynamic_refcount;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
610 n->dynamic_refcount = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
611 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
612 else if (n->dynamic_refcount)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
613 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
614 n->dynamic_refcount--;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
615 n->refcount--;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
616 }
111
kono
parents:
diff changeset
617
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
618 if (n->refcount == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
619 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
620 if (n->tgt->refcount == 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
621 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
622 struct target_mem_desc *tp, *t;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
623 for (tp = NULL, t = acc_dev->openacc.data_environ; t != NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
624 tp = t, t = t->prev)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
625 if (n->tgt == t)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
626 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
627 if (tp)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
628 tp->prev = t->prev;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
629 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
630 acc_dev->openacc.data_environ = t->prev;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
631 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
632 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
633 }
111
kono
parents:
diff changeset
634
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
635 if (f & FLAG_COPYOUT)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
636 acc_dev->dev2host_func (acc_dev->target_id, h, d, s);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
637
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
638 gomp_remove_var (acc_dev, n);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
639 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
640
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
641 gomp_mutex_unlock (&acc_dev->lock);
111
kono
parents:
diff changeset
642 }
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 void
kono
parents:
diff changeset
645 acc_delete (void *h , size_t s)
kono
parents:
diff changeset
646 {
kono
parents:
diff changeset
647 delete_copyout (0, h, s, __FUNCTION__);
kono
parents:
diff changeset
648 }
kono
parents:
diff changeset
649
kono
parents:
diff changeset
650 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
651 acc_delete_finalize (void *h , size_t s)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
652 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
653 delete_copyout (FLAG_FINALIZE, h, s, __FUNCTION__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
654 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
655
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
656 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
657 acc_delete_finalize_async (void *h , size_t s, int async)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
658 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
659 delete_copyout (FLAG_FINALIZE, h, s, __FUNCTION__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
660 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
661
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
662 void
111
kono
parents:
diff changeset
663 acc_copyout (void *h, size_t s)
kono
parents:
diff changeset
664 {
kono
parents:
diff changeset
665 delete_copyout (FLAG_COPYOUT, h, s, __FUNCTION__);
kono
parents:
diff changeset
666 }
kono
parents:
diff changeset
667
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
668 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
669 acc_copyout_finalize (void *h, size_t s)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
670 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
671 delete_copyout (FLAG_COPYOUT | FLAG_FINALIZE, h, s, __FUNCTION__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
672 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
673
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
674 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
675 acc_copyout_finalize_async (void *h, size_t s, int async)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
676 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
677 delete_copyout (FLAG_COPYOUT | FLAG_FINALIZE, h, s, __FUNCTION__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
678 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
679
111
kono
parents:
diff changeset
680 static void
kono
parents:
diff changeset
681 update_dev_host (int is_dev, void *h, size_t s)
kono
parents:
diff changeset
682 {
kono
parents:
diff changeset
683 splay_tree_key n;
kono
parents:
diff changeset
684 void *d;
kono
parents:
diff changeset
685
kono
parents:
diff changeset
686 goacc_lazy_initialize ();
kono
parents:
diff changeset
687
kono
parents:
diff changeset
688 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
689 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 if (acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
kono
parents:
diff changeset
692 return;
kono
parents:
diff changeset
693
kono
parents:
diff changeset
694 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
695
kono
parents:
diff changeset
696 n = lookup_host (acc_dev, h, s);
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 if (!n)
kono
parents:
diff changeset
699 {
kono
parents:
diff changeset
700 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
701 gomp_fatal ("[%p,%d] is not mapped", h, (int)s);
kono
parents:
diff changeset
702 }
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 d = (void *) (n->tgt->tgt_start + n->tgt_offset
kono
parents:
diff changeset
705 + (uintptr_t) h - n->host_start);
kono
parents:
diff changeset
706
kono
parents:
diff changeset
707 if (is_dev)
kono
parents:
diff changeset
708 acc_dev->host2dev_func (acc_dev->target_id, d, h, s);
kono
parents:
diff changeset
709 else
kono
parents:
diff changeset
710 acc_dev->dev2host_func (acc_dev->target_id, h, d, s);
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
713 }
kono
parents:
diff changeset
714
kono
parents:
diff changeset
715 void
kono
parents:
diff changeset
716 acc_update_device (void *h, size_t s)
kono
parents:
diff changeset
717 {
kono
parents:
diff changeset
718 update_dev_host (1, h, s);
kono
parents:
diff changeset
719 }
kono
parents:
diff changeset
720
kono
parents:
diff changeset
721 void
kono
parents:
diff changeset
722 acc_update_self (void *h, size_t s)
kono
parents:
diff changeset
723 {
kono
parents:
diff changeset
724 update_dev_host (0, h, s);
kono
parents:
diff changeset
725 }
kono
parents:
diff changeset
726
kono
parents:
diff changeset
727 void
kono
parents:
diff changeset
728 gomp_acc_insert_pointer (size_t mapnum, void **hostaddrs, size_t *sizes,
kono
parents:
diff changeset
729 void *kinds)
kono
parents:
diff changeset
730 {
kono
parents:
diff changeset
731 struct target_mem_desc *tgt;
kono
parents:
diff changeset
732 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
733 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
734
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
735 if (acc_is_present (*hostaddrs, *sizes))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
736 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
737 splay_tree_key n;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
738 gomp_mutex_lock (&acc_dev->lock);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
739 n = lookup_host (acc_dev, *hostaddrs, *sizes);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
740 gomp_mutex_unlock (&acc_dev->lock);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
741
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
742 tgt = n->tgt;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
743 for (size_t i = 0; i < tgt->list_count; i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
744 if (tgt->list[i].key == n)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
745 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
746 for (size_t j = 0; j < mapnum; j++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
747 if (i + j < tgt->list_count && tgt->list[i + j].key)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
748 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
749 tgt->list[i + j].key->refcount++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
750 tgt->list[i + j].key->dynamic_refcount++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
751 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
752 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
753 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
754 /* Should not reach here. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
755 gomp_fatal ("Dynamic refcount incrementing failed for pointer/pset");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
756 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
757
111
kono
parents:
diff changeset
758 gomp_debug (0, " %s: prepare mappings\n", __FUNCTION__);
kono
parents:
diff changeset
759 tgt = gomp_map_vars (acc_dev, mapnum, hostaddrs,
kono
parents:
diff changeset
760 NULL, sizes, kinds, true, GOMP_MAP_VARS_OPENACC);
kono
parents:
diff changeset
761 gomp_debug (0, " %s: mappings prepared\n", __FUNCTION__);
kono
parents:
diff changeset
762
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
763 /* Initialize dynamic refcount. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764 tgt->list[0].key->dynamic_refcount = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
765
111
kono
parents:
diff changeset
766 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
767 tgt->prev = acc_dev->openacc.data_environ;
kono
parents:
diff changeset
768 acc_dev->openacc.data_environ = tgt;
kono
parents:
diff changeset
769 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
770 }
kono
parents:
diff changeset
771
kono
parents:
diff changeset
772 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
773 gomp_acc_remove_pointer (void *h, size_t s, bool force_copyfrom, int async,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
774 int finalize, int mapnum)
111
kono
parents:
diff changeset
775 {
kono
parents:
diff changeset
776 struct goacc_thread *thr = goacc_thread ();
kono
parents:
diff changeset
777 struct gomp_device_descr *acc_dev = thr->dev;
kono
parents:
diff changeset
778 splay_tree_key n;
kono
parents:
diff changeset
779 struct target_mem_desc *t;
kono
parents:
diff changeset
780 int minrefs = (mapnum == 1) ? 2 : 3;
kono
parents:
diff changeset
781
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782 if (!acc_is_present (h, s))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
783 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784
111
kono
parents:
diff changeset
785 gomp_mutex_lock (&acc_dev->lock);
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 n = lookup_host (acc_dev, h, 1);
kono
parents:
diff changeset
788
kono
parents:
diff changeset
789 if (!n)
kono
parents:
diff changeset
790 {
kono
parents:
diff changeset
791 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
792 gomp_fatal ("%p is not a mapped block", (void *)h);
kono
parents:
diff changeset
793 }
kono
parents:
diff changeset
794
kono
parents:
diff changeset
795 gomp_debug (0, " %s: restore mappings\n", __FUNCTION__);
kono
parents:
diff changeset
796
kono
parents:
diff changeset
797 t = n->tgt;
kono
parents:
diff changeset
798
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
799 if (n->refcount < n->dynamic_refcount)
111
kono
parents:
diff changeset
800 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
801 gomp_mutex_unlock (&acc_dev->lock);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
802 gomp_fatal ("Dynamic reference counting assert fail\n");
111
kono
parents:
diff changeset
803 }
kono
parents:
diff changeset
804
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
805 if (finalize)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
806 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
807 n->refcount -= n->dynamic_refcount;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
808 n->dynamic_refcount = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
809 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
810 else if (n->dynamic_refcount)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
811 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
812 n->dynamic_refcount--;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
813 n->refcount--;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
814 }
111
kono
parents:
diff changeset
815
kono
parents:
diff changeset
816 gomp_mutex_unlock (&acc_dev->lock);
kono
parents:
diff changeset
817
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
818 if (n->refcount == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
819 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
820 if (t->refcount == minrefs)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
821 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
822 /* This is the last reference, so pull the descriptor off the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
823 chain. This prevents gomp_unmap_vars via gomp_unmap_tgt from
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
824 freeing the device memory. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
825 struct target_mem_desc *tp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
826 for (tp = NULL, t = acc_dev->openacc.data_environ; t != NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
827 tp = t, t = t->prev)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
828 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
829 if (n->tgt == t)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
830 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
831 if (tp)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
832 tp->prev = t->prev;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
833 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
834 acc_dev->openacc.data_environ = t->prev;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
835 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
836 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
837 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
838 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
839
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
840 /* Set refcount to 1 to allow gomp_unmap_vars to unmap it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
841 n->refcount = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
842 t->refcount = minrefs;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
843 for (size_t i = 0; i < t->list_count; i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
844 if (t->list[i].key == n)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
845 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
846 t->list[i].copy_from = force_copyfrom ? 1 : 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
847 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
848 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
849
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
850 /* If running synchronously, unmap immediately. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
851 if (async < acc_async_noval)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
852 gomp_unmap_vars (t, true);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
853 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
854 t->device_descr->openacc.register_async_cleanup_func (t, async);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
855 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
856
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
857 gomp_mutex_unlock (&acc_dev->lock);
111
kono
parents:
diff changeset
858
kono
parents:
diff changeset
859 gomp_debug (0, " %s: mappings restored\n", __FUNCTION__);
kono
parents:
diff changeset
860 }