annotate libgomp/libgomp.h @ 124:c3a50d7877e8

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