annotate libgomp/libgomp.h @ 143:76e1cf5455ef

add cbc_gc test
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 19:24:05 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1 /* Copyright (C) 2005-2018 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 Contributed by Richard Henderson <rth@redhat.com>.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
111
kono
parents: 67
diff changeset
4 This file is part of the GNU Offloading and Multi Processing Library
kono
parents: 67
diff changeset
5 (libgomp).
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 Libgomp is free software; you can redistribute it and/or modify it
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 under the terms of the GNU General Public License as published by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 any later version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 Under Section 7 of GPL version 3, you are granted additional
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 permissions described in the GCC Runtime Library Exception, version
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 3.1, as published by the Free Software Foundation.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 You should have received a copy of the GNU General Public License and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 a copy of the GCC Runtime Library Exception along with this program;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 /* This file contains data types and function declarations that are not
111
kono
parents: 67
diff changeset
27 part of the official OpenACC or OpenMP user interfaces. There are
kono
parents: 67
diff changeset
28 declarations in here that are part of the GNU Offloading and Multi
kono
parents: 67
diff changeset
29 Processing ABI, in that the compiler is required to know about them
kono
parents: 67
diff changeset
30 and use them.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 The convention is that the all caps prefix "GOMP" is used group items
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 that are part of the external ABI, and the lower case prefix "gomp"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 is used group items that are completely private to the library. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 #ifndef LIBGOMP_H
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 #define LIBGOMP_H 1
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
111
kono
parents: 67
diff changeset
39 #ifndef _LIBGOMP_CHECKING_
kono
parents: 67
diff changeset
40 /* Define to 1 to perform internal sanity checks. */
kono
parents: 67
diff changeset
41 #define _LIBGOMP_CHECKING_ 0
kono
parents: 67
diff changeset
42 #endif
kono
parents: 67
diff changeset
43
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 #include "gstdint.h"
111
kono
parents: 67
diff changeset
46 #include "libgomp-plugin.h"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
47 #include "gomp-constants.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
111
kono
parents: 67
diff changeset
49 #ifdef HAVE_PTHREAD_H
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 #include <pthread.h>
111
kono
parents: 67
diff changeset
51 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 #include <stdbool.h>
111
kono
parents: 67
diff changeset
53 #include <stdlib.h>
kono
parents: 67
diff changeset
54 #include <stdarg.h>
kono
parents: 67
diff changeset
55
kono
parents: 67
diff changeset
56 /* Needed for memset in priority_queue.c. */
kono
parents: 67
diff changeset
57 #if _LIBGOMP_CHECKING_
kono
parents: 67
diff changeset
58 # ifdef STRING_WITH_STRINGS
kono
parents: 67
diff changeset
59 # include <string.h>
kono
parents: 67
diff changeset
60 # include <strings.h>
kono
parents: 67
diff changeset
61 # else
kono
parents: 67
diff changeset
62 # ifdef HAVE_STRING_H
kono
parents: 67
diff changeset
63 # include <string.h>
kono
parents: 67
diff changeset
64 # else
kono
parents: 67
diff changeset
65 # ifdef HAVE_STRINGS_H
kono
parents: 67
diff changeset
66 # include <strings.h>
kono
parents: 67
diff changeset
67 # endif
kono
parents: 67
diff changeset
68 # endif
kono
parents: 67
diff changeset
69 # endif
kono
parents: 67
diff changeset
70 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 #ifdef HAVE_ATTRIBUTE_VISIBILITY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 # pragma GCC visibility push(hidden)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75
111
kono
parents: 67
diff changeset
76 /* If we were a C++ library, we'd get this from <std/atomic>. */
kono
parents: 67
diff changeset
77 enum memmodel
kono
parents: 67
diff changeset
78 {
kono
parents: 67
diff changeset
79 MEMMODEL_RELAXED = 0,
kono
parents: 67
diff changeset
80 MEMMODEL_CONSUME = 1,
kono
parents: 67
diff changeset
81 MEMMODEL_ACQUIRE = 2,
kono
parents: 67
diff changeset
82 MEMMODEL_RELEASE = 3,
kono
parents: 67
diff changeset
83 MEMMODEL_ACQ_REL = 4,
kono
parents: 67
diff changeset
84 MEMMODEL_SEQ_CST = 5
kono
parents: 67
diff changeset
85 };
kono
parents: 67
diff changeset
86
kono
parents: 67
diff changeset
87 /* alloc.c */
kono
parents: 67
diff changeset
88
kono
parents: 67
diff changeset
89 extern void *gomp_malloc (size_t) __attribute__((malloc));
kono
parents: 67
diff changeset
90 extern void *gomp_malloc_cleared (size_t) __attribute__((malloc));
kono
parents: 67
diff changeset
91 extern void *gomp_realloc (void *, size_t);
kono
parents: 67
diff changeset
92
kono
parents: 67
diff changeset
93 /* Avoid conflicting prototypes of alloca() in system headers by using
kono
parents: 67
diff changeset
94 GCC's builtin alloca(). */
kono
parents: 67
diff changeset
95 #define gomp_alloca(x) __builtin_alloca(x)
kono
parents: 67
diff changeset
96
kono
parents: 67
diff changeset
97 /* error.c */
kono
parents: 67
diff changeset
98
kono
parents: 67
diff changeset
99 extern void gomp_vdebug (int, const char *, va_list);
kono
parents: 67
diff changeset
100 extern void gomp_debug (int, const char *, ...)
kono
parents: 67
diff changeset
101 __attribute__ ((format (printf, 2, 3)));
kono
parents: 67
diff changeset
102 #define gomp_vdebug(KIND, FMT, VALIST) \
kono
parents: 67
diff changeset
103 do { \
kono
parents: 67
diff changeset
104 if (__builtin_expect (gomp_debug_var, 0)) \
kono
parents: 67
diff changeset
105 (gomp_vdebug) ((KIND), (FMT), (VALIST)); \
kono
parents: 67
diff changeset
106 } while (0)
kono
parents: 67
diff changeset
107 #define gomp_debug(KIND, ...) \
kono
parents: 67
diff changeset
108 do { \
kono
parents: 67
diff changeset
109 if (__builtin_expect (gomp_debug_var, 0)) \
kono
parents: 67
diff changeset
110 (gomp_debug) ((KIND), __VA_ARGS__); \
kono
parents: 67
diff changeset
111 } while (0)
kono
parents: 67
diff changeset
112 extern void gomp_verror (const char *, va_list);
kono
parents: 67
diff changeset
113 extern void gomp_error (const char *, ...)
kono
parents: 67
diff changeset
114 __attribute__ ((format (printf, 1, 2)));
kono
parents: 67
diff changeset
115 extern void gomp_vfatal (const char *, va_list)
kono
parents: 67
diff changeset
116 __attribute__ ((noreturn));
kono
parents: 67
diff changeset
117 extern void gomp_fatal (const char *, ...)
kono
parents: 67
diff changeset
118 __attribute__ ((noreturn, format (printf, 1, 2)));
kono
parents: 67
diff changeset
119
kono
parents: 67
diff changeset
120 struct gomp_task;
kono
parents: 67
diff changeset
121 struct gomp_taskgroup;
kono
parents: 67
diff changeset
122 struct htab;
kono
parents: 67
diff changeset
123
kono
parents: 67
diff changeset
124 #include "priority_queue.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 #include "sem.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 #include "mutex.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 #include "bar.h"
111
kono
parents: 67
diff changeset
128 #include "simple-bar.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 #include "ptrlock.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 /* This structure contains the data to control one work-sharing construct,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 either a LOOP (FOR/DO) or a SECTIONS. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 enum gomp_schedule_type
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 GFS_RUNTIME,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 GFS_STATIC,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 GFS_DYNAMIC,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 GFS_GUIDED,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 GFS_AUTO
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
111
kono
parents: 67
diff changeset
144 struct gomp_doacross_work_share
kono
parents: 67
diff changeset
145 {
kono
parents: 67
diff changeset
146 union {
kono
parents: 67
diff changeset
147 /* chunk_size copy, as ws->chunk_size is multiplied by incr for
kono
parents: 67
diff changeset
148 GFS_DYNAMIC. */
kono
parents: 67
diff changeset
149 long chunk_size;
kono
parents: 67
diff changeset
150 /* Likewise, but for ull implementation. */
kono
parents: 67
diff changeset
151 unsigned long long chunk_size_ull;
kono
parents: 67
diff changeset
152 /* For schedule(static,0) this is the number
kono
parents: 67
diff changeset
153 of iterations assigned to the last thread, i.e. number of
kono
parents: 67
diff changeset
154 iterations / number of threads. */
kono
parents: 67
diff changeset
155 long q;
kono
parents: 67
diff changeset
156 /* Likewise, but for ull implementation. */
kono
parents: 67
diff changeset
157 unsigned long long q_ull;
kono
parents: 67
diff changeset
158 };
kono
parents: 67
diff changeset
159 /* Size of each array entry (padded to cache line size). */
kono
parents: 67
diff changeset
160 unsigned long elt_sz;
kono
parents: 67
diff changeset
161 /* Number of dimensions in sink vectors. */
kono
parents: 67
diff changeset
162 unsigned int ncounts;
kono
parents: 67
diff changeset
163 /* True if the iterations can be flattened. */
kono
parents: 67
diff changeset
164 bool flattened;
kono
parents: 67
diff changeset
165 /* Actual array (of elt_sz sized units), aligned to cache line size.
kono
parents: 67
diff changeset
166 This is indexed by team_id for GFS_STATIC and outermost iteration
kono
parents: 67
diff changeset
167 / chunk_size for other schedules. */
kono
parents: 67
diff changeset
168 unsigned char *array;
kono
parents: 67
diff changeset
169 /* These two are only used for schedule(static,0). */
kono
parents: 67
diff changeset
170 /* This one is number of iterations % number of threads. */
kono
parents: 67
diff changeset
171 long t;
kono
parents: 67
diff changeset
172 union {
kono
parents: 67
diff changeset
173 /* And this one is cached t * (q + 1). */
kono
parents: 67
diff changeset
174 long boundary;
kono
parents: 67
diff changeset
175 /* Likewise, but for the ull implementation. */
kono
parents: 67
diff changeset
176 unsigned long long boundary_ull;
kono
parents: 67
diff changeset
177 };
kono
parents: 67
diff changeset
178 /* Array of shift counts for each dimension if they can be flattened. */
kono
parents: 67
diff changeset
179 unsigned int shift_counts[];
kono
parents: 67
diff changeset
180 };
kono
parents: 67
diff changeset
181
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 struct gomp_work_share
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 /* This member records the SCHEDULE clause to be used for this construct.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 The user specification of "runtime" will already have been resolved.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 If this is a SECTIONS construct, this value will always be DYNAMIC. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 enum gomp_schedule_type sched;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 int mode;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 union {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 struct {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 /* This is the chunk_size argument to the SCHEDULE clause. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 long chunk_size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 /* This is the iteration end point. If this is a SECTIONS construct,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 this is the number of contained sections. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 long end;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 /* This is the iteration step. If this is a SECTIONS construct, this
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 is always 1. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 long incr;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 struct {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 /* The same as above, but for the unsigned long long loop variants. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 unsigned long long chunk_size_ull;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 unsigned long long end_ull;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 unsigned long long incr_ull;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212
111
kono
parents: 67
diff changeset
213 union {
kono
parents: 67
diff changeset
214 /* This is a circular queue that details which threads will be allowed
kono
parents: 67
diff changeset
215 into the ordered region and in which order. When a thread allocates
kono
parents: 67
diff changeset
216 iterations on which it is going to work, it also registers itself at
kono
parents: 67
diff changeset
217 the end of the array. When a thread reaches the ordered region, it
kono
parents: 67
diff changeset
218 checks to see if it is the one at the head of the queue. If not, it
kono
parents: 67
diff changeset
219 blocks on its RELEASE semaphore. */
kono
parents: 67
diff changeset
220 unsigned *ordered_team_ids;
kono
parents: 67
diff changeset
221
kono
parents: 67
diff changeset
222 /* This is a pointer to DOACROSS work share data. */
kono
parents: 67
diff changeset
223 struct gomp_doacross_work_share *doacross;
kono
parents: 67
diff changeset
224 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 /* This is the number of threads that have registered themselves in
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 the circular queue ordered_team_ids. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 unsigned ordered_num_used;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 /* This is the team_id of the currently acknowledged owner of the ordered
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 section, or -1u if the ordered section has not been acknowledged by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 any thread. This is distinguished from the thread that is *allowed*
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 to take the section next. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 unsigned ordered_owner;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 /* This is the index into the circular queue ordered_team_ids of the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 current thread that's allowed into the ordered reason. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 unsigned ordered_cur;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 /* This is a chain of allocated gomp_work_share blocks, valid only
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 in the first gomp_work_share struct in the block. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 struct gomp_work_share *next_alloc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 /* The above fields are written once during workshare initialization,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 or related to ordered worksharing. Make sure the following fields
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 are in a different cache line. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 /* This lock protects the update of the following members. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 gomp_mutex_t lock __attribute__((aligned (64)));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 /* This is the count of the number of threads that have exited the work
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 share construct. If the construct was marked nowait, they have moved on
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 to other work; otherwise they're blocked on a barrier. The last member
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 of the team to exit the work share construct must deallocate it. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 unsigned threads_completed;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 union {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 /* This is the next iteration value to be allocated. In the case of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 GFS_STATIC loops, this the iteration start point and never changes. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 long next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 /* The same, but with unsigned long long type. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 unsigned long long next_ull;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 /* This is the returned data structure for SINGLE COPYPRIVATE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 void *copyprivate;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 union {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 /* Link to gomp_work_share struct for next work sharing construct
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 encountered after this one. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 gomp_ptrlock_t next_ws;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 /* gomp_work_share structs are chained in the free work share cache
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 through this. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 struct gomp_work_share *next_free;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
278
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 /* If only few threads are in the team, ordered_team_ids can point
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 to this array which fills the padding at the end of this struct. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 unsigned inline_ordered_team_ids[0];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 /* This structure contains all of the thread-local data associated with
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 a thread team. This is the data that must be saved when a thread
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 encounters a nested PARALLEL construct. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
287
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 struct gomp_team_state
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 /* This is the team of which the thread is currently a member. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 struct gomp_team *team;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
292
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 /* This is the work share construct which this thread is currently
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 processing. Recall that with NOWAIT, not all threads may be
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 processing the same construct. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 struct gomp_work_share *work_share;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
297
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 /* This is the previous work share construct or NULL if there wasn't any.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 When all threads are done with the current work sharing construct,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 the previous one can be freed. The current one can't, as its
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 next_ws field is used. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 struct gomp_work_share *last_work_share;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 /* This is the ID of this thread within the team. This value is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 guaranteed to be between 0 and N-1, where N is the number of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 threads in the team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 unsigned team_id;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
308
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 /* Nesting level. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 unsigned level;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
311
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 /* Active nesting level. Only active parallel regions are counted. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 unsigned active_level;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314
111
kono
parents: 67
diff changeset
315 /* Place-partition-var, offset and length into gomp_places_list array. */
kono
parents: 67
diff changeset
316 unsigned place_partition_off;
kono
parents: 67
diff changeset
317 unsigned place_partition_len;
kono
parents: 67
diff changeset
318
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 #ifdef HAVE_SYNC_BUILTINS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 /* Number of single stmts encountered. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 unsigned long single_count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 /* For GFS_RUNTIME loops that resolved to GFS_STATIC, this is the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 trip number through the loop. So first time a particular loop
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 is encountered this number is 0, the second time through the loop
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 is 1, etc. This is unused when the compiler knows in advance that
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 the loop is statically scheduled. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 unsigned long static_trip;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
331
111
kono
parents: 67
diff changeset
332 struct target_mem_desc;
kono
parents: 67
diff changeset
333
kono
parents: 67
diff changeset
334 /* These are the OpenMP 4.0 Internal Control Variables described in
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 section 2.3.1. Those described as having one copy per task are
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 stored within the structure; those described as having one copy
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 for the whole program are (naturally) global variables. */
111
kono
parents: 67
diff changeset
338
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 struct gomp_task_icv
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
340 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 unsigned long nthreads_var;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 enum gomp_schedule_type run_sched_var;
111
kono
parents: 67
diff changeset
343 int run_sched_chunk_size;
kono
parents: 67
diff changeset
344 int default_device_var;
kono
parents: 67
diff changeset
345 unsigned int thread_limit_var;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 bool dyn_var;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 bool nest_var;
111
kono
parents: 67
diff changeset
348 char bind_var;
kono
parents: 67
diff changeset
349 /* Internal ICV. */
kono
parents: 67
diff changeset
350 struct target_mem_desc *target_data;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 extern struct gomp_task_icv gomp_global_icv;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 #ifndef HAVE_SYNC_BUILTINS
111
kono
parents: 67
diff changeset
355 extern gomp_mutex_t gomp_managed_threads_lock;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
357 extern unsigned long gomp_max_active_levels_var;
111
kono
parents: 67
diff changeset
358 extern bool gomp_cancel_var;
kono
parents: 67
diff changeset
359 extern int gomp_max_task_priority_var;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 extern unsigned long long gomp_spin_count_var, gomp_throttled_spin_count_var;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
361 extern unsigned long gomp_available_cpus, gomp_managed_threads;
111
kono
parents: 67
diff changeset
362 extern unsigned long *gomp_nthreads_var_list, gomp_nthreads_var_list_len;
kono
parents: 67
diff changeset
363 extern char *gomp_bind_var_list;
kono
parents: 67
diff changeset
364 extern unsigned long gomp_bind_var_list_len;
kono
parents: 67
diff changeset
365 extern void **gomp_places_list;
kono
parents: 67
diff changeset
366 extern unsigned long gomp_places_list_len;
kono
parents: 67
diff changeset
367 extern unsigned int gomp_num_teams_var;
kono
parents: 67
diff changeset
368 extern int gomp_debug_var;
kono
parents: 67
diff changeset
369 extern int goacc_device_num;
kono
parents: 67
diff changeset
370 extern char *goacc_device_type;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
371 extern int goacc_default_dims[GOMP_DIM_MAX];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 enum gomp_task_kind
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 {
111
kono
parents: 67
diff changeset
375 /* Implicit task. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
376 GOMP_TASK_IMPLICIT,
111
kono
parents: 67
diff changeset
377 /* Undeferred task. */
kono
parents: 67
diff changeset
378 GOMP_TASK_UNDEFERRED,
kono
parents: 67
diff changeset
379 /* Task created by GOMP_task and waiting to be run. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
380 GOMP_TASK_WAITING,
111
kono
parents: 67
diff changeset
381 /* Task currently executing or scheduled and about to execute. */
kono
parents: 67
diff changeset
382 GOMP_TASK_TIED,
kono
parents: 67
diff changeset
383 /* Used for target tasks that have vars mapped and async run started,
kono
parents: 67
diff changeset
384 but not yet completed. Once that completes, they will be readded
kono
parents: 67
diff changeset
385 into the queues as GOMP_TASK_WAITING in order to perform the var
kono
parents: 67
diff changeset
386 unmapping. */
kono
parents: 67
diff changeset
387 GOMP_TASK_ASYNC_RUNNING
kono
parents: 67
diff changeset
388 };
kono
parents: 67
diff changeset
389
kono
parents: 67
diff changeset
390 struct gomp_task_depend_entry
kono
parents: 67
diff changeset
391 {
kono
parents: 67
diff changeset
392 /* Address of dependency. */
kono
parents: 67
diff changeset
393 void *addr;
kono
parents: 67
diff changeset
394 struct gomp_task_depend_entry *next;
kono
parents: 67
diff changeset
395 struct gomp_task_depend_entry *prev;
kono
parents: 67
diff changeset
396 /* Task that provides the dependency in ADDR. */
kono
parents: 67
diff changeset
397 struct gomp_task *task;
kono
parents: 67
diff changeset
398 /* Depend entry is of type "IN". */
kono
parents: 67
diff changeset
399 bool is_in;
kono
parents: 67
diff changeset
400 bool redundant;
kono
parents: 67
diff changeset
401 bool redundant_out;
kono
parents: 67
diff changeset
402 };
kono
parents: 67
diff changeset
403
kono
parents: 67
diff changeset
404 struct gomp_dependers_vec
kono
parents: 67
diff changeset
405 {
kono
parents: 67
diff changeset
406 size_t n_elem;
kono
parents: 67
diff changeset
407 size_t allocated;
kono
parents: 67
diff changeset
408 struct gomp_task *elem[];
kono
parents: 67
diff changeset
409 };
kono
parents: 67
diff changeset
410
kono
parents: 67
diff changeset
411 /* Used when in GOMP_taskwait or in gomp_task_maybe_wait_for_dependencies. */
kono
parents: 67
diff changeset
412
kono
parents: 67
diff changeset
413 struct gomp_taskwait
kono
parents: 67
diff changeset
414 {
kono
parents: 67
diff changeset
415 bool in_taskwait;
kono
parents: 67
diff changeset
416 bool in_depend_wait;
kono
parents: 67
diff changeset
417 /* Number of tasks we are waiting for. */
kono
parents: 67
diff changeset
418 size_t n_depend;
kono
parents: 67
diff changeset
419 gomp_sem_t taskwait_sem;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
421
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 /* This structure describes a "task" to be run by a thread. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
423
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 struct gomp_task
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 {
111
kono
parents: 67
diff changeset
426 /* Parent of this task. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 struct gomp_task *parent;
111
kono
parents: 67
diff changeset
428 /* Children of this task. */
kono
parents: 67
diff changeset
429 struct priority_queue children_queue;
kono
parents: 67
diff changeset
430 /* Taskgroup this task belongs in. */
kono
parents: 67
diff changeset
431 struct gomp_taskgroup *taskgroup;
kono
parents: 67
diff changeset
432 /* Tasks that depend on this task. */
kono
parents: 67
diff changeset
433 struct gomp_dependers_vec *dependers;
kono
parents: 67
diff changeset
434 struct htab *depend_hash;
kono
parents: 67
diff changeset
435 struct gomp_taskwait *taskwait;
kono
parents: 67
diff changeset
436 /* Number of items in DEPEND. */
kono
parents: 67
diff changeset
437 size_t depend_count;
kono
parents: 67
diff changeset
438 /* Number of tasks this task depends on. Once this counter reaches
kono
parents: 67
diff changeset
439 0, we have no unsatisfied dependencies, and this task can be put
kono
parents: 67
diff changeset
440 into the various queues to be scheduled. */
kono
parents: 67
diff changeset
441 size_t num_dependees;
kono
parents: 67
diff changeset
442
kono
parents: 67
diff changeset
443 /* Priority of this task. */
kono
parents: 67
diff changeset
444 int priority;
kono
parents: 67
diff changeset
445 /* The priority node for this task in each of the different queues.
kono
parents: 67
diff changeset
446 We put this here to avoid allocating space for each priority
kono
parents: 67
diff changeset
447 node. Then we play offsetof() games to convert between pnode[]
kono
parents: 67
diff changeset
448 entries and the gomp_task in which they reside. */
kono
parents: 67
diff changeset
449 struct priority_node pnode[3];
kono
parents: 67
diff changeset
450
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 struct gomp_task_icv icv;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 void (*fn) (void *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 void *fn_data;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 enum gomp_task_kind kind;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 bool in_tied_task;
111
kono
parents: 67
diff changeset
456 bool final_task;
kono
parents: 67
diff changeset
457 bool copy_ctors_done;
kono
parents: 67
diff changeset
458 /* Set for undeferred tasks with unsatisfied dependencies which
kono
parents: 67
diff changeset
459 block further execution of their parent until the dependencies
kono
parents: 67
diff changeset
460 are satisfied. */
kono
parents: 67
diff changeset
461 bool parent_depends_on;
kono
parents: 67
diff changeset
462 /* Dependencies provided and/or needed for this task. DEPEND_COUNT
kono
parents: 67
diff changeset
463 is the number of items available. */
kono
parents: 67
diff changeset
464 struct gomp_task_depend_entry depend[];
kono
parents: 67
diff changeset
465 };
kono
parents: 67
diff changeset
466
kono
parents: 67
diff changeset
467 /* This structure describes a single #pragma omp taskgroup. */
kono
parents: 67
diff changeset
468
kono
parents: 67
diff changeset
469 struct gomp_taskgroup
kono
parents: 67
diff changeset
470 {
kono
parents: 67
diff changeset
471 struct gomp_taskgroup *prev;
kono
parents: 67
diff changeset
472 /* Queue of tasks that belong in this taskgroup. */
kono
parents: 67
diff changeset
473 struct priority_queue taskgroup_queue;
kono
parents: 67
diff changeset
474 bool in_taskgroup_wait;
kono
parents: 67
diff changeset
475 bool cancelled;
kono
parents: 67
diff changeset
476 gomp_sem_t taskgroup_sem;
kono
parents: 67
diff changeset
477 size_t num_children;
kono
parents: 67
diff changeset
478 };
kono
parents: 67
diff changeset
479
kono
parents: 67
diff changeset
480 /* Various state of OpenMP async offloading tasks. */
kono
parents: 67
diff changeset
481 enum gomp_target_task_state
kono
parents: 67
diff changeset
482 {
kono
parents: 67
diff changeset
483 GOMP_TARGET_TASK_DATA,
kono
parents: 67
diff changeset
484 GOMP_TARGET_TASK_BEFORE_MAP,
kono
parents: 67
diff changeset
485 GOMP_TARGET_TASK_FALLBACK,
kono
parents: 67
diff changeset
486 GOMP_TARGET_TASK_READY_TO_RUN,
kono
parents: 67
diff changeset
487 GOMP_TARGET_TASK_RUNNING,
kono
parents: 67
diff changeset
488 GOMP_TARGET_TASK_FINISHED
kono
parents: 67
diff changeset
489 };
kono
parents: 67
diff changeset
490
kono
parents: 67
diff changeset
491 /* This structure describes a target task. */
kono
parents: 67
diff changeset
492
kono
parents: 67
diff changeset
493 struct gomp_target_task
kono
parents: 67
diff changeset
494 {
kono
parents: 67
diff changeset
495 struct gomp_device_descr *devicep;
kono
parents: 67
diff changeset
496 void (*fn) (void *);
kono
parents: 67
diff changeset
497 size_t mapnum;
kono
parents: 67
diff changeset
498 size_t *sizes;
kono
parents: 67
diff changeset
499 unsigned short *kinds;
kono
parents: 67
diff changeset
500 unsigned int flags;
kono
parents: 67
diff changeset
501 enum gomp_target_task_state state;
kono
parents: 67
diff changeset
502 struct target_mem_desc *tgt;
kono
parents: 67
diff changeset
503 struct gomp_task *task;
kono
parents: 67
diff changeset
504 struct gomp_team *team;
kono
parents: 67
diff changeset
505 /* Device-specific target arguments. */
kono
parents: 67
diff changeset
506 void **args;
kono
parents: 67
diff changeset
507 void *hostaddrs[];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
509
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 /* This structure describes a "team" of threads. These are the threads
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 that are spawned by a PARALLEL constructs, as well as the work sharing
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 constructs that the team encounters. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
513
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 struct gomp_team
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 /* This is the number of threads in the current team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
517 unsigned nthreads;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
518
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
519 /* This is number of gomp_work_share structs that have been allocated
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
520 as a block last time. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 unsigned work_share_chunk;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
522
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
523 /* This is the saved team state that applied to a master thread before
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
524 the current thread was created. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
525 struct gomp_team_state prev_ts;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
526
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
527 /* This semaphore should be used by the master thread instead of its
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
528 "native" semaphore in the thread structure. Required for nested
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
529 parallels, as the master is a member of two teams. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
530 gomp_sem_t master_release;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
531
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
532 /* This points to an array with pointers to the release semaphore
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
533 of the threads in the team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
534 gomp_sem_t **ordered_release;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
535
111
kono
parents: 67
diff changeset
536 /* List of work shares on which gomp_fini_work_share hasn't been
kono
parents: 67
diff changeset
537 called yet. If the team hasn't been cancelled, this should be
kono
parents: 67
diff changeset
538 equal to each thr->ts.work_share, but otherwise it can be a possibly
kono
parents: 67
diff changeset
539 long list of workshares. */
kono
parents: 67
diff changeset
540 struct gomp_work_share *work_shares_to_free;
kono
parents: 67
diff changeset
541
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
542 /* List of gomp_work_share structs chained through next_free fields.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
543 This is populated and taken off only by the first thread in the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
544 team encountering a new work sharing construct, in a critical
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
545 section. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 struct gomp_work_share *work_share_list_alloc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
547
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
548 /* List of gomp_work_share structs freed by free_work_share. New
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
549 entries are atomically added to the start of the list, and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
550 alloc_work_share can safely only move all but the first entry
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 to work_share_list alloc, as free_work_share can happen concurrently
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
552 with alloc_work_share. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
553 struct gomp_work_share *work_share_list_free;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
554
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
555 #ifdef HAVE_SYNC_BUILTINS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
556 /* Number of simple single regions encountered by threads in this
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
557 team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
558 unsigned long single_count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
559 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
560 /* Mutex protecting addition of workshares to work_share_list_free. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
561 gomp_mutex_t work_share_list_free_lock;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
562 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
563
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
564 /* This barrier is used for most synchronization of the team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
565 gomp_barrier_t barrier;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
566
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 /* Initial work shares, to avoid allocating any gomp_work_share
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
568 structs in the common case. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 struct gomp_work_share work_shares[8];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
570
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
571 gomp_mutex_t task_lock;
111
kono
parents: 67
diff changeset
572 /* Scheduled tasks. */
kono
parents: 67
diff changeset
573 struct priority_queue task_queue;
kono
parents: 67
diff changeset
574 /* Number of all GOMP_TASK_{WAITING,TIED} tasks in the team. */
kono
parents: 67
diff changeset
575 unsigned int task_count;
kono
parents: 67
diff changeset
576 /* Number of GOMP_TASK_WAITING tasks currently waiting to be scheduled. */
kono
parents: 67
diff changeset
577 unsigned int task_queued_count;
kono
parents: 67
diff changeset
578 /* Number of GOMP_TASK_{WAITING,TIED} tasks currently running
kono
parents: 67
diff changeset
579 directly in gomp_barrier_handle_tasks; tasks spawned
kono
parents: 67
diff changeset
580 from e.g. GOMP_taskwait or GOMP_taskgroup_end don't count, even when
kono
parents: 67
diff changeset
581 that is called from a task run from gomp_barrier_handle_tasks.
kono
parents: 67
diff changeset
582 task_running_count should be always <= team->nthreads,
kono
parents: 67
diff changeset
583 and if current task isn't in_tied_task, then it will be
kono
parents: 67
diff changeset
584 even < team->nthreads. */
kono
parents: 67
diff changeset
585 unsigned int task_running_count;
kono
parents: 67
diff changeset
586 int work_share_cancelled;
kono
parents: 67
diff changeset
587 int team_cancelled;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
588
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
589 /* This array contains structures for implicit tasks. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 struct gomp_task implicit_task[];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
591 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
592
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
593 /* This structure contains all data that is private to libgomp and is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
594 allocated per thread. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
595
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
596 struct gomp_thread
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
598 /* This is the function that the thread should run upon launch. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
599 void (*fn) (void *data);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
600 void *data;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
601
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
602 /* This is the current team state for this thread. The ts.team member
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
603 is NULL only if the thread is idle. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
604 struct gomp_team_state ts;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
605
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
606 /* This is the task that the thread is currently executing. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
607 struct gomp_task *task;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
608
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
609 /* This semaphore is used for ordered loops. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
610 gomp_sem_t release;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
611
111
kono
parents: 67
diff changeset
612 /* Place this thread is bound to plus one, or zero if not bound
kono
parents: 67
diff changeset
613 to any place. */
kono
parents: 67
diff changeset
614 unsigned int place;
kono
parents: 67
diff changeset
615
kono
parents: 67
diff changeset
616 /* User pthread thread pool */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
617 struct gomp_thread_pool *thread_pool;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
618 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
619
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
620
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
621 struct gomp_thread_pool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
622 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
623 /* This array manages threads spawned from the top level, which will
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
624 return to the idle loop once the current PARALLEL construct ends. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
625 struct gomp_thread **threads;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
626 unsigned threads_size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
627 unsigned threads_used;
111
kono
parents: 67
diff changeset
628 /* The last team is used for non-nested teams to delay their destruction to
kono
parents: 67
diff changeset
629 make sure all the threads in the team move on to the pool's barrier before
kono
parents: 67
diff changeset
630 the team's barrier is destroyed. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
631 struct gomp_team *last_team;
111
kono
parents: 67
diff changeset
632 /* Number of threads running in this contention group. */
kono
parents: 67
diff changeset
633 unsigned long threads_busy;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
634
111
kono
parents: 67
diff changeset
635 /* This barrier holds and releases threads waiting in thread pools. */
kono
parents: 67
diff changeset
636 gomp_simple_barrier_t threads_dock;
kono
parents: 67
diff changeset
637 };
kono
parents: 67
diff changeset
638
kono
parents: 67
diff changeset
639 enum gomp_cancel_kind
kono
parents: 67
diff changeset
640 {
kono
parents: 67
diff changeset
641 GOMP_CANCEL_PARALLEL = 1,
kono
parents: 67
diff changeset
642 GOMP_CANCEL_LOOP = 2,
kono
parents: 67
diff changeset
643 GOMP_CANCEL_FOR = GOMP_CANCEL_LOOP,
kono
parents: 67
diff changeset
644 GOMP_CANCEL_DO = GOMP_CANCEL_LOOP,
kono
parents: 67
diff changeset
645 GOMP_CANCEL_SECTIONS = 4,
kono
parents: 67
diff changeset
646 GOMP_CANCEL_TASKGROUP = 8
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
647 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
648
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
649 /* ... and here is that TLS data. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
650
111
kono
parents: 67
diff changeset
651 #if defined __nvptx__
kono
parents: 67
diff changeset
652 extern struct gomp_thread *nvptx_thrs __attribute__((shared));
kono
parents: 67
diff changeset
653 static inline struct gomp_thread *gomp_thread (void)
kono
parents: 67
diff changeset
654 {
kono
parents: 67
diff changeset
655 int tid;
kono
parents: 67
diff changeset
656 asm ("mov.u32 %0, %%tid.y;" : "=r" (tid));
kono
parents: 67
diff changeset
657 return nvptx_thrs + tid;
kono
parents: 67
diff changeset
658 }
kono
parents: 67
diff changeset
659 #elif defined HAVE_TLS || defined USE_EMUTLS
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
660 extern __thread struct gomp_thread gomp_tls_data;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
661 static inline struct gomp_thread *gomp_thread (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
662 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
663 return &gomp_tls_data;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
664 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
665 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
666 extern pthread_key_t gomp_tls_key;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
667 static inline struct gomp_thread *gomp_thread (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
668 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
669 return pthread_getspecific (gomp_tls_key);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
670 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
671 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
672
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
673 extern struct gomp_task_icv *gomp_new_icv (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
674
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
675 /* Here's how to access the current copy of the ICVs. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
676
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
677 static inline struct gomp_task_icv *gomp_icv (bool write)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
678 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 struct gomp_task *task = gomp_thread ()->task;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
680 if (task)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
681 return &task->icv;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
682 else if (write)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
683 return gomp_new_icv ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
684 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
685 return &gomp_global_icv;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
686 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
687
111
kono
parents: 67
diff changeset
688 #ifdef LIBGOMP_USE_PTHREADS
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
689 /* The attributes to be used during thread creation. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
690 extern pthread_attr_t gomp_thread_attr;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
691
111
kono
parents: 67
diff changeset
692 extern pthread_key_t gomp_thread_destructor;
kono
parents: 67
diff changeset
693 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
694
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
695 /* Function prototypes. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
696
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
697 /* affinity.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
698
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
699 extern void gomp_init_affinity (void);
111
kono
parents: 67
diff changeset
700 #ifdef LIBGOMP_USE_PTHREADS
kono
parents: 67
diff changeset
701 extern void gomp_init_thread_affinity (pthread_attr_t *, unsigned int);
kono
parents: 67
diff changeset
702 #endif
kono
parents: 67
diff changeset
703 extern void **gomp_affinity_alloc (unsigned long, bool);
kono
parents: 67
diff changeset
704 extern void gomp_affinity_init_place (void *);
kono
parents: 67
diff changeset
705 extern bool gomp_affinity_add_cpus (void *, unsigned long, unsigned long,
kono
parents: 67
diff changeset
706 long, bool);
kono
parents: 67
diff changeset
707 extern bool gomp_affinity_remove_cpu (void *, unsigned long);
kono
parents: 67
diff changeset
708 extern bool gomp_affinity_copy_place (void *, void *, long);
kono
parents: 67
diff changeset
709 extern bool gomp_affinity_same_place (void *, void *);
kono
parents: 67
diff changeset
710 extern bool gomp_affinity_finalize_place_list (bool);
kono
parents: 67
diff changeset
711 extern bool gomp_affinity_init_level (int, unsigned long, bool);
kono
parents: 67
diff changeset
712 extern void gomp_affinity_print_place (void *);
kono
parents: 67
diff changeset
713 extern void gomp_get_place_proc_ids_8 (int, int64_t *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
714
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
715 /* iter.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
716
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
717 extern int gomp_iter_static_next (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
718 extern bool gomp_iter_dynamic_next_locked (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
719 extern bool gomp_iter_guided_next_locked (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
720
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
721 #ifdef HAVE_SYNC_BUILTINS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
722 extern bool gomp_iter_dynamic_next (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 extern bool gomp_iter_guided_next (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
724 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
725
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
726 /* iter_ull.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
727
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
728 extern int gomp_iter_ull_static_next (unsigned long long *,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
729 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
730 extern bool gomp_iter_ull_dynamic_next_locked (unsigned long long *,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
731 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
732 extern bool gomp_iter_ull_guided_next_locked (unsigned long long *,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
733 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
734
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
735 #if defined HAVE_SYNC_BUILTINS && defined __LP64__
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
736 extern bool gomp_iter_ull_dynamic_next (unsigned long long *,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
737 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
738 extern bool gomp_iter_ull_guided_next (unsigned long long *,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
739 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
740 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
741
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
742 /* ordered.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
743
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
744 extern void gomp_ordered_first (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
745 extern void gomp_ordered_last (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
746 extern void gomp_ordered_next (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
747 extern void gomp_ordered_static_init (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
748 extern void gomp_ordered_static_next (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
749 extern void gomp_ordered_sync (void);
111
kono
parents: 67
diff changeset
750 extern void gomp_doacross_init (unsigned, long *, long);
kono
parents: 67
diff changeset
751 extern void gomp_doacross_ull_init (unsigned, unsigned long long *,
kono
parents: 67
diff changeset
752 unsigned long long);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
753
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
754 /* parallel.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
755
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
756 extern unsigned gomp_resolve_num_threads (unsigned, unsigned);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
757
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
758 /* proc.c (in config/) */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
759
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
760 extern void gomp_init_num_threads (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
761 extern unsigned gomp_dynamic_max_threads (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
762
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
763 /* task.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
764
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
765 extern void gomp_init_task (struct gomp_task *, struct gomp_task *,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
766 struct gomp_task_icv *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
767 extern void gomp_end_task (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
768 extern void gomp_barrier_handle_tasks (gomp_barrier_state_t);
111
kono
parents: 67
diff changeset
769 extern void gomp_task_maybe_wait_for_dependencies (void **);
kono
parents: 67
diff changeset
770 extern bool gomp_create_target_task (struct gomp_device_descr *,
kono
parents: 67
diff changeset
771 void (*) (void *), size_t, void **,
kono
parents: 67
diff changeset
772 size_t *, unsigned short *, unsigned int,
kono
parents: 67
diff changeset
773 void **, void **,
kono
parents: 67
diff changeset
774 enum gomp_target_task_state);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
775
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
776 static void inline
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
777 gomp_finish_task (struct gomp_task *task)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
778 {
111
kono
parents: 67
diff changeset
779 if (__builtin_expect (task->depend_hash != NULL, 0))
kono
parents: 67
diff changeset
780 free (task->depend_hash);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
781 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
782
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
783 /* team.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
784
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
785 extern struct gomp_team *gomp_new_team (unsigned);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
786 extern void gomp_team_start (void (*) (void *), void *, unsigned,
111
kono
parents: 67
diff changeset
787 unsigned, struct gomp_team *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
788 extern void gomp_team_end (void);
111
kono
parents: 67
diff changeset
789 extern void gomp_free_thread (void *);
kono
parents: 67
diff changeset
790
kono
parents: 67
diff changeset
791 /* target.c */
kono
parents: 67
diff changeset
792
kono
parents: 67
diff changeset
793 extern void gomp_init_targets_once (void);
kono
parents: 67
diff changeset
794 extern int gomp_get_num_devices (void);
kono
parents: 67
diff changeset
795 extern bool gomp_target_task_fn (void *);
kono
parents: 67
diff changeset
796
kono
parents: 67
diff changeset
797 /* Splay tree definitions. */
kono
parents: 67
diff changeset
798 typedef struct splay_tree_node_s *splay_tree_node;
kono
parents: 67
diff changeset
799 typedef struct splay_tree_s *splay_tree;
kono
parents: 67
diff changeset
800 typedef struct splay_tree_key_s *splay_tree_key;
kono
parents: 67
diff changeset
801
kono
parents: 67
diff changeset
802 struct target_var_desc {
kono
parents: 67
diff changeset
803 /* Splay key. */
kono
parents: 67
diff changeset
804 splay_tree_key key;
kono
parents: 67
diff changeset
805 /* True if data should be copied from device to host at the end. */
kono
parents: 67
diff changeset
806 bool copy_from;
kono
parents: 67
diff changeset
807 /* True if data always should be copied from device to host at the end. */
kono
parents: 67
diff changeset
808 bool always_copy_from;
kono
parents: 67
diff changeset
809 /* Relative offset against key host_start. */
kono
parents: 67
diff changeset
810 uintptr_t offset;
kono
parents: 67
diff changeset
811 /* Actual length. */
kono
parents: 67
diff changeset
812 uintptr_t length;
kono
parents: 67
diff changeset
813 };
kono
parents: 67
diff changeset
814
kono
parents: 67
diff changeset
815 struct target_mem_desc {
kono
parents: 67
diff changeset
816 /* Reference count. */
kono
parents: 67
diff changeset
817 uintptr_t refcount;
kono
parents: 67
diff changeset
818 /* All the splay nodes allocated together. */
kono
parents: 67
diff changeset
819 splay_tree_node array;
kono
parents: 67
diff changeset
820 /* Start of the target region. */
kono
parents: 67
diff changeset
821 uintptr_t tgt_start;
kono
parents: 67
diff changeset
822 /* End of the targer region. */
kono
parents: 67
diff changeset
823 uintptr_t tgt_end;
kono
parents: 67
diff changeset
824 /* Handle to free. */
kono
parents: 67
diff changeset
825 void *to_free;
kono
parents: 67
diff changeset
826 /* Previous target_mem_desc. */
kono
parents: 67
diff changeset
827 struct target_mem_desc *prev;
kono
parents: 67
diff changeset
828 /* Number of items in following list. */
kono
parents: 67
diff changeset
829 size_t list_count;
kono
parents: 67
diff changeset
830
kono
parents: 67
diff changeset
831 /* Corresponding target device descriptor. */
kono
parents: 67
diff changeset
832 struct gomp_device_descr *device_descr;
kono
parents: 67
diff changeset
833
kono
parents: 67
diff changeset
834 /* List of target items to remove (or decrease refcount)
kono
parents: 67
diff changeset
835 at the end of region. */
kono
parents: 67
diff changeset
836 struct target_var_desc list[];
kono
parents: 67
diff changeset
837 };
kono
parents: 67
diff changeset
838
kono
parents: 67
diff changeset
839 /* Special value for refcount - infinity. */
kono
parents: 67
diff changeset
840 #define REFCOUNT_INFINITY (~(uintptr_t) 0)
kono
parents: 67
diff changeset
841 /* Special value for refcount - tgt_offset contains target address of the
kono
parents: 67
diff changeset
842 artificial pointer to "omp declare target link" object. */
kono
parents: 67
diff changeset
843 #define REFCOUNT_LINK (~(uintptr_t) 1)
kono
parents: 67
diff changeset
844
kono
parents: 67
diff changeset
845 struct splay_tree_key_s {
kono
parents: 67
diff changeset
846 /* Address of the host object. */
kono
parents: 67
diff changeset
847 uintptr_t host_start;
kono
parents: 67
diff changeset
848 /* Address immediately after the host object. */
kono
parents: 67
diff changeset
849 uintptr_t host_end;
kono
parents: 67
diff changeset
850 /* Descriptor of the target memory. */
kono
parents: 67
diff changeset
851 struct target_mem_desc *tgt;
kono
parents: 67
diff changeset
852 /* Offset from tgt->tgt_start to the start of the target object. */
kono
parents: 67
diff changeset
853 uintptr_t tgt_offset;
kono
parents: 67
diff changeset
854 /* Reference count. */
kono
parents: 67
diff changeset
855 uintptr_t refcount;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
856 /* Dynamic reference count. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
857 uintptr_t dynamic_refcount;
111
kono
parents: 67
diff changeset
858 /* Pointer to the original mapping of "omp declare target link" object. */
kono
parents: 67
diff changeset
859 splay_tree_key link_key;
kono
parents: 67
diff changeset
860 };
kono
parents: 67
diff changeset
861
kono
parents: 67
diff changeset
862 /* The comparison function. */
kono
parents: 67
diff changeset
863
kono
parents: 67
diff changeset
864 static inline int
kono
parents: 67
diff changeset
865 splay_compare (splay_tree_key x, splay_tree_key y)
kono
parents: 67
diff changeset
866 {
kono
parents: 67
diff changeset
867 if (x->host_start == x->host_end
kono
parents: 67
diff changeset
868 && y->host_start == y->host_end)
kono
parents: 67
diff changeset
869 return 0;
kono
parents: 67
diff changeset
870 if (x->host_end <= y->host_start)
kono
parents: 67
diff changeset
871 return -1;
kono
parents: 67
diff changeset
872 if (x->host_start >= y->host_end)
kono
parents: 67
diff changeset
873 return 1;
kono
parents: 67
diff changeset
874 return 0;
kono
parents: 67
diff changeset
875 }
kono
parents: 67
diff changeset
876
kono
parents: 67
diff changeset
877 #include "splay-tree.h"
kono
parents: 67
diff changeset
878
kono
parents: 67
diff changeset
879 typedef struct acc_dispatch_t
kono
parents: 67
diff changeset
880 {
kono
parents: 67
diff changeset
881 /* This is a linked list of data mapped using the
kono
parents: 67
diff changeset
882 acc_map_data/acc_unmap_data or "acc enter data"/"acc exit data" pragmas.
kono
parents: 67
diff changeset
883 Unlike mapped_data in the goacc_thread struct, unmapping can
kono
parents: 67
diff changeset
884 happen out-of-order with respect to mapping. */
kono
parents: 67
diff changeset
885 /* This is guarded by the lock in the "outer" struct gomp_device_descr. */
kono
parents: 67
diff changeset
886 struct target_mem_desc *data_environ;
kono
parents: 67
diff changeset
887
kono
parents: 67
diff changeset
888 /* Execute. */
kono
parents: 67
diff changeset
889 __typeof (GOMP_OFFLOAD_openacc_exec) *exec_func;
kono
parents: 67
diff changeset
890
kono
parents: 67
diff changeset
891 /* Async cleanup callback registration. */
kono
parents: 67
diff changeset
892 __typeof (GOMP_OFFLOAD_openacc_register_async_cleanup)
kono
parents: 67
diff changeset
893 *register_async_cleanup_func;
kono
parents: 67
diff changeset
894
kono
parents: 67
diff changeset
895 /* Asynchronous routines. */
kono
parents: 67
diff changeset
896 __typeof (GOMP_OFFLOAD_openacc_async_test) *async_test_func;
kono
parents: 67
diff changeset
897 __typeof (GOMP_OFFLOAD_openacc_async_test_all) *async_test_all_func;
kono
parents: 67
diff changeset
898 __typeof (GOMP_OFFLOAD_openacc_async_wait) *async_wait_func;
kono
parents: 67
diff changeset
899 __typeof (GOMP_OFFLOAD_openacc_async_wait_async) *async_wait_async_func;
kono
parents: 67
diff changeset
900 __typeof (GOMP_OFFLOAD_openacc_async_wait_all) *async_wait_all_func;
kono
parents: 67
diff changeset
901 __typeof (GOMP_OFFLOAD_openacc_async_wait_all_async)
kono
parents: 67
diff changeset
902 *async_wait_all_async_func;
kono
parents: 67
diff changeset
903 __typeof (GOMP_OFFLOAD_openacc_async_set_async) *async_set_async_func;
kono
parents: 67
diff changeset
904
kono
parents: 67
diff changeset
905 /* Create/destroy TLS data. */
kono
parents: 67
diff changeset
906 __typeof (GOMP_OFFLOAD_openacc_create_thread_data) *create_thread_data_func;
kono
parents: 67
diff changeset
907 __typeof (GOMP_OFFLOAD_openacc_destroy_thread_data)
kono
parents: 67
diff changeset
908 *destroy_thread_data_func;
kono
parents: 67
diff changeset
909
kono
parents: 67
diff changeset
910 /* NVIDIA target specific routines. */
kono
parents: 67
diff changeset
911 struct {
kono
parents: 67
diff changeset
912 __typeof (GOMP_OFFLOAD_openacc_cuda_get_current_device)
kono
parents: 67
diff changeset
913 *get_current_device_func;
kono
parents: 67
diff changeset
914 __typeof (GOMP_OFFLOAD_openacc_cuda_get_current_context)
kono
parents: 67
diff changeset
915 *get_current_context_func;
kono
parents: 67
diff changeset
916 __typeof (GOMP_OFFLOAD_openacc_cuda_get_stream) *get_stream_func;
kono
parents: 67
diff changeset
917 __typeof (GOMP_OFFLOAD_openacc_cuda_set_stream) *set_stream_func;
kono
parents: 67
diff changeset
918 } cuda;
kono
parents: 67
diff changeset
919 } acc_dispatch_t;
kono
parents: 67
diff changeset
920
kono
parents: 67
diff changeset
921 /* Various state of the accelerator device. */
kono
parents: 67
diff changeset
922 enum gomp_device_state
kono
parents: 67
diff changeset
923 {
kono
parents: 67
diff changeset
924 GOMP_DEVICE_UNINITIALIZED,
kono
parents: 67
diff changeset
925 GOMP_DEVICE_INITIALIZED,
kono
parents: 67
diff changeset
926 GOMP_DEVICE_FINALIZED
kono
parents: 67
diff changeset
927 };
kono
parents: 67
diff changeset
928
kono
parents: 67
diff changeset
929 /* This structure describes accelerator device.
kono
parents: 67
diff changeset
930 It contains name of the corresponding libgomp plugin, function handlers for
kono
parents: 67
diff changeset
931 interaction with the device, ID-number of the device, and information about
kono
parents: 67
diff changeset
932 mapped memory. */
kono
parents: 67
diff changeset
933 struct gomp_device_descr
kono
parents: 67
diff changeset
934 {
kono
parents: 67
diff changeset
935 /* Immutable data, which is only set during initialization, and which is not
kono
parents: 67
diff changeset
936 guarded by the lock. */
kono
parents: 67
diff changeset
937
kono
parents: 67
diff changeset
938 /* The name of the device. */
kono
parents: 67
diff changeset
939 const char *name;
kono
parents: 67
diff changeset
940
kono
parents: 67
diff changeset
941 /* Capabilities of device (supports OpenACC, OpenMP). */
kono
parents: 67
diff changeset
942 unsigned int capabilities;
kono
parents: 67
diff changeset
943
kono
parents: 67
diff changeset
944 /* This is the ID number of device among devices of the same type. */
kono
parents: 67
diff changeset
945 int target_id;
kono
parents: 67
diff changeset
946
kono
parents: 67
diff changeset
947 /* This is the TYPE of device. */
kono
parents: 67
diff changeset
948 enum offload_target_type type;
kono
parents: 67
diff changeset
949
kono
parents: 67
diff changeset
950 /* Function handlers. */
kono
parents: 67
diff changeset
951 __typeof (GOMP_OFFLOAD_get_name) *get_name_func;
kono
parents: 67
diff changeset
952 __typeof (GOMP_OFFLOAD_get_caps) *get_caps_func;
kono
parents: 67
diff changeset
953 __typeof (GOMP_OFFLOAD_get_type) *get_type_func;
kono
parents: 67
diff changeset
954 __typeof (GOMP_OFFLOAD_get_num_devices) *get_num_devices_func;
kono
parents: 67
diff changeset
955 __typeof (GOMP_OFFLOAD_init_device) *init_device_func;
kono
parents: 67
diff changeset
956 __typeof (GOMP_OFFLOAD_fini_device) *fini_device_func;
kono
parents: 67
diff changeset
957 __typeof (GOMP_OFFLOAD_version) *version_func;
kono
parents: 67
diff changeset
958 __typeof (GOMP_OFFLOAD_load_image) *load_image_func;
kono
parents: 67
diff changeset
959 __typeof (GOMP_OFFLOAD_unload_image) *unload_image_func;
kono
parents: 67
diff changeset
960 __typeof (GOMP_OFFLOAD_alloc) *alloc_func;
kono
parents: 67
diff changeset
961 __typeof (GOMP_OFFLOAD_free) *free_func;
kono
parents: 67
diff changeset
962 __typeof (GOMP_OFFLOAD_dev2host) *dev2host_func;
kono
parents: 67
diff changeset
963 __typeof (GOMP_OFFLOAD_host2dev) *host2dev_func;
kono
parents: 67
diff changeset
964 __typeof (GOMP_OFFLOAD_dev2dev) *dev2dev_func;
kono
parents: 67
diff changeset
965 __typeof (GOMP_OFFLOAD_can_run) *can_run_func;
kono
parents: 67
diff changeset
966 __typeof (GOMP_OFFLOAD_run) *run_func;
kono
parents: 67
diff changeset
967 __typeof (GOMP_OFFLOAD_async_run) *async_run_func;
kono
parents: 67
diff changeset
968
kono
parents: 67
diff changeset
969 /* Splay tree containing information about mapped memory regions. */
kono
parents: 67
diff changeset
970 struct splay_tree_s mem_map;
kono
parents: 67
diff changeset
971
kono
parents: 67
diff changeset
972 /* Mutex for the mutable data. */
kono
parents: 67
diff changeset
973 gomp_mutex_t lock;
kono
parents: 67
diff changeset
974
kono
parents: 67
diff changeset
975 /* Current state of the device. OpenACC allows to move from INITIALIZED state
kono
parents: 67
diff changeset
976 back to UNINITIALIZED state. OpenMP allows only to move from INITIALIZED
kono
parents: 67
diff changeset
977 to FINALIZED state (at program shutdown). */
kono
parents: 67
diff changeset
978 enum gomp_device_state state;
kono
parents: 67
diff changeset
979
kono
parents: 67
diff changeset
980 /* OpenACC-specific data and functions. */
kono
parents: 67
diff changeset
981 /* This is mutable because of its mutable data_environ and target_data
kono
parents: 67
diff changeset
982 members. */
kono
parents: 67
diff changeset
983 acc_dispatch_t openacc;
kono
parents: 67
diff changeset
984 };
kono
parents: 67
diff changeset
985
kono
parents: 67
diff changeset
986 /* Kind of the pragma, for which gomp_map_vars () is called. */
kono
parents: 67
diff changeset
987 enum gomp_map_vars_kind
kono
parents: 67
diff changeset
988 {
kono
parents: 67
diff changeset
989 GOMP_MAP_VARS_OPENACC,
kono
parents: 67
diff changeset
990 GOMP_MAP_VARS_TARGET,
kono
parents: 67
diff changeset
991 GOMP_MAP_VARS_DATA,
kono
parents: 67
diff changeset
992 GOMP_MAP_VARS_ENTER_DATA
kono
parents: 67
diff changeset
993 };
kono
parents: 67
diff changeset
994
kono
parents: 67
diff changeset
995 extern void gomp_acc_insert_pointer (size_t, void **, size_t *, void *);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996 extern void gomp_acc_remove_pointer (void *, size_t, bool, int, int, int);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
997 extern void gomp_acc_declare_allocate (bool, size_t, void **, size_t *,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
998 unsigned short *);
111
kono
parents: 67
diff changeset
999
kono
parents: 67
diff changeset
1000 extern struct target_mem_desc *gomp_map_vars (struct gomp_device_descr *,
kono
parents: 67
diff changeset
1001 size_t, void **, void **,
kono
parents: 67
diff changeset
1002 size_t *, void *, bool,
kono
parents: 67
diff changeset
1003 enum gomp_map_vars_kind);
kono
parents: 67
diff changeset
1004 extern void gomp_unmap_vars (struct target_mem_desc *, bool);
kono
parents: 67
diff changeset
1005 extern void gomp_init_device (struct gomp_device_descr *);
kono
parents: 67
diff changeset
1006 extern void gomp_free_memmap (struct splay_tree_s *);
kono
parents: 67
diff changeset
1007 extern void gomp_unload_device (struct gomp_device_descr *);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1008 extern bool gomp_remove_var (struct gomp_device_descr *, splay_tree_key);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1009
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1010 /* work.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1011
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1012 extern void gomp_init_work_share (struct gomp_work_share *, bool, unsigned);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1013 extern void gomp_fini_work_share (struct gomp_work_share *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1014 extern bool gomp_work_share_start (bool);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1015 extern void gomp_work_share_end (void);
111
kono
parents: 67
diff changeset
1016 extern bool gomp_work_share_end_cancel (void);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1017 extern void gomp_work_share_end_nowait (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1018
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1019 static inline void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1020 gomp_work_share_init_done (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1021 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1022 struct gomp_thread *thr = gomp_thread ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1023 if (__builtin_expect (thr->ts.last_work_share != NULL, 1))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1024 gomp_ptrlock_set (&thr->ts.last_work_share->next_ws, thr->ts.work_share);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1025 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1026
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1027 #ifdef HAVE_ATTRIBUTE_VISIBILITY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1028 # pragma GCC visibility pop
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1029 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1030
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1031 /* Now that we're back to default visibility, include the globals. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1032 #include "libgomp_g.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1033
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1034 /* Include omp.h by parts. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1035 #include "omp-lock.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1036 #define _LIBGOMP_OMP_LOCK_DEFINED 1
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1037 #include "omp.h.in"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1038
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1039 #if !defined (HAVE_ATTRIBUTE_VISIBILITY) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1040 || !defined (HAVE_ATTRIBUTE_ALIAS) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1041 || !defined (HAVE_AS_SYMVER_DIRECTIVE) \
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1042 || !defined (PIC) \
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1043 || !defined (HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1044 # undef LIBGOMP_GNU_SYMBOL_VERSIONING
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1045 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1046
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1047 #ifdef LIBGOMP_GNU_SYMBOL_VERSIONING
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1048 extern void gomp_init_lock_30 (omp_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1049 extern void gomp_destroy_lock_30 (omp_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1050 extern void gomp_set_lock_30 (omp_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1051 extern void gomp_unset_lock_30 (omp_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1052 extern int gomp_test_lock_30 (omp_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1053 extern void gomp_init_nest_lock_30 (omp_nest_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1054 extern void gomp_destroy_nest_lock_30 (omp_nest_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1055 extern void gomp_set_nest_lock_30 (omp_nest_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1056 extern void gomp_unset_nest_lock_30 (omp_nest_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1057 extern int gomp_test_nest_lock_30 (omp_nest_lock_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1058
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1059 extern void gomp_init_lock_25 (omp_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1060 extern void gomp_destroy_lock_25 (omp_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1061 extern void gomp_set_lock_25 (omp_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1062 extern void gomp_unset_lock_25 (omp_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1063 extern int gomp_test_lock_25 (omp_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1064 extern void gomp_init_nest_lock_25 (omp_nest_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1065 extern void gomp_destroy_nest_lock_25 (omp_nest_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1066 extern void gomp_set_nest_lock_25 (omp_nest_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1067 extern void gomp_unset_nest_lock_25 (omp_nest_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1068 extern int gomp_test_nest_lock_25 (omp_nest_lock_25_t *) __GOMP_NOTHROW;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1069
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1070 # define omp_lock_symver(fn) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1071 __asm (".symver g" #fn "_30, " #fn "@@OMP_3.0"); \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1072 __asm (".symver g" #fn "_25, " #fn "@OMP_1.0");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1073 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1074 # define gomp_init_lock_30 omp_init_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1075 # define gomp_destroy_lock_30 omp_destroy_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1076 # define gomp_set_lock_30 omp_set_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1077 # define gomp_unset_lock_30 omp_unset_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1078 # define gomp_test_lock_30 omp_test_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1079 # define gomp_init_nest_lock_30 omp_init_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1080 # define gomp_destroy_nest_lock_30 omp_destroy_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1081 # define gomp_set_nest_lock_30 omp_set_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1082 # define gomp_unset_nest_lock_30 omp_unset_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1083 # define gomp_test_nest_lock_30 omp_test_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1084 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1085
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1086 #ifdef HAVE_ATTRIBUTE_VISIBILITY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1087 # define attribute_hidden __attribute__ ((visibility ("hidden")))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1088 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1089 # define attribute_hidden
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1090 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1091
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1092 #ifdef HAVE_ATTRIBUTE_ALIAS
111
kono
parents: 67
diff changeset
1093 # define strong_alias(fn, al) \
kono
parents: 67
diff changeset
1094 extern __typeof (fn) al __attribute__ ((alias (#fn)));
kono
parents: 67
diff changeset
1095
kono
parents: 67
diff changeset
1096 # define ialias_ulp ialias_str1(__USER_LABEL_PREFIX__)
kono
parents: 67
diff changeset
1097 # define ialias_str1(x) ialias_str2(x)
kono
parents: 67
diff changeset
1098 # define ialias_str2(x) #x
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1099 # define ialias(fn) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1100 extern __typeof (fn) gomp_ialias_##fn \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1101 __attribute__ ((alias (#fn))) attribute_hidden;
111
kono
parents: 67
diff changeset
1102 # define ialias_redirect(fn) \
kono
parents: 67
diff changeset
1103 extern __typeof (fn) fn __asm__ (ialias_ulp "gomp_ialias_" #fn) attribute_hidden;
kono
parents: 67
diff changeset
1104 # define ialias_call(fn) gomp_ialias_ ## fn
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1105 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1106 # define ialias(fn)
111
kono
parents: 67
diff changeset
1107 # define ialias_redirect(fn)
kono
parents: 67
diff changeset
1108 # define ialias_call(fn) fn
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1109 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1110
111
kono
parents: 67
diff changeset
1111 /* Helper function for priority_node_to_task() and
kono
parents: 67
diff changeset
1112 task_to_priority_node().
kono
parents: 67
diff changeset
1113
kono
parents: 67
diff changeset
1114 Return the offset from a task to its priority_node entry. The
kono
parents: 67
diff changeset
1115 priority_node entry is has a type of TYPE. */
kono
parents: 67
diff changeset
1116
kono
parents: 67
diff changeset
1117 static inline size_t
kono
parents: 67
diff changeset
1118 priority_queue_offset (enum priority_queue_type type)
kono
parents: 67
diff changeset
1119 {
kono
parents: 67
diff changeset
1120 return offsetof (struct gomp_task, pnode[(int) type]);
kono
parents: 67
diff changeset
1121 }
kono
parents: 67
diff changeset
1122
kono
parents: 67
diff changeset
1123 /* Return the task associated with a priority NODE of type TYPE. */
kono
parents: 67
diff changeset
1124
kono
parents: 67
diff changeset
1125 static inline struct gomp_task *
kono
parents: 67
diff changeset
1126 priority_node_to_task (enum priority_queue_type type,
kono
parents: 67
diff changeset
1127 struct priority_node *node)
kono
parents: 67
diff changeset
1128 {
kono
parents: 67
diff changeset
1129 return (struct gomp_task *) ((char *) node - priority_queue_offset (type));
kono
parents: 67
diff changeset
1130 }
kono
parents: 67
diff changeset
1131
kono
parents: 67
diff changeset
1132 /* Return the priority node of type TYPE for a given TASK. */
kono
parents: 67
diff changeset
1133
kono
parents: 67
diff changeset
1134 static inline struct priority_node *
kono
parents: 67
diff changeset
1135 task_to_priority_node (enum priority_queue_type type,
kono
parents: 67
diff changeset
1136 struct gomp_task *task)
kono
parents: 67
diff changeset
1137 {
kono
parents: 67
diff changeset
1138 return (struct priority_node *) ((char *) task
kono
parents: 67
diff changeset
1139 + priority_queue_offset (type));
kono
parents: 67
diff changeset
1140 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1141 #endif /* LIBGOMP_H */