annotate libgomp/libgomp.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1 /* Copyright (C) 2005-2020 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"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
45 #include <stdint.h>
111
kono
parents: 67
diff changeset
46 #include "libgomp-plugin.h"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
47 #include "gomp-constants.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
111
kono
parents: 67
diff changeset
49 #ifdef HAVE_PTHREAD_H
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 #include <pthread.h>
111
kono
parents: 67
diff changeset
51 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 #include <stdbool.h>
111
kono
parents: 67
diff changeset
53 #include <stdlib.h>
kono
parents: 67
diff changeset
54 #include <stdarg.h>
kono
parents: 67
diff changeset
55
kono
parents: 67
diff changeset
56 /* Needed for memset in priority_queue.c. */
kono
parents: 67
diff changeset
57 #if _LIBGOMP_CHECKING_
kono
parents: 67
diff changeset
58 # ifdef STRING_WITH_STRINGS
kono
parents: 67
diff changeset
59 # include <string.h>
kono
parents: 67
diff changeset
60 # include <strings.h>
kono
parents: 67
diff changeset
61 # else
kono
parents: 67
diff changeset
62 # ifdef HAVE_STRING_H
kono
parents: 67
diff changeset
63 # include <string.h>
kono
parents: 67
diff changeset
64 # else
kono
parents: 67
diff changeset
65 # ifdef HAVE_STRINGS_H
kono
parents: 67
diff changeset
66 # include <strings.h>
kono
parents: 67
diff changeset
67 # endif
kono
parents: 67
diff changeset
68 # endif
kono
parents: 67
diff changeset
69 # endif
kono
parents: 67
diff changeset
70 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 #ifdef HAVE_ATTRIBUTE_VISIBILITY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 # pragma GCC visibility push(hidden)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75
111
kono
parents: 67
diff changeset
76 /* If we were a C++ library, we'd get this from <std/atomic>. */
kono
parents: 67
diff changeset
77 enum memmodel
kono
parents: 67
diff changeset
78 {
kono
parents: 67
diff changeset
79 MEMMODEL_RELAXED = 0,
kono
parents: 67
diff changeset
80 MEMMODEL_CONSUME = 1,
kono
parents: 67
diff changeset
81 MEMMODEL_ACQUIRE = 2,
kono
parents: 67
diff changeset
82 MEMMODEL_RELEASE = 3,
kono
parents: 67
diff changeset
83 MEMMODEL_ACQ_REL = 4,
kono
parents: 67
diff changeset
84 MEMMODEL_SEQ_CST = 5
kono
parents: 67
diff changeset
85 };
kono
parents: 67
diff changeset
86
kono
parents: 67
diff changeset
87 /* alloc.c */
kono
parents: 67
diff changeset
88
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
89 #if defined(HAVE_ALIGNED_ALLOC) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
90 || defined(HAVE__ALIGNED_MALLOC) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
91 || defined(HAVE_POSIX_MEMALIGN) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
92 || defined(HAVE_MEMALIGN)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
93 /* Defined if gomp_aligned_alloc doesn't use fallback version
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
94 and free can be used instead of gomp_aligned_free. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
95 #define GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC 1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
96 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
97
111
kono
parents: 67
diff changeset
98 extern void *gomp_malloc (size_t) __attribute__((malloc));
kono
parents: 67
diff changeset
99 extern void *gomp_malloc_cleared (size_t) __attribute__((malloc));
kono
parents: 67
diff changeset
100 extern void *gomp_realloc (void *, size_t);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
101 extern void *gomp_aligned_alloc (size_t, size_t)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
102 __attribute__((malloc, alloc_size (2)));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
103 extern void gomp_aligned_free (void *);
111
kono
parents: 67
diff changeset
104
kono
parents: 67
diff changeset
105 /* Avoid conflicting prototypes of alloca() in system headers by using
kono
parents: 67
diff changeset
106 GCC's builtin alloca(). */
kono
parents: 67
diff changeset
107 #define gomp_alloca(x) __builtin_alloca(x)
kono
parents: 67
diff changeset
108
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
109 /* Optimized allocators for team-specific data that will die with the team. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
110
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
111 #ifdef __AMDGCN__
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
112 /* The arena is initialized in config/gcn/team.c. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
113 #define TEAM_ARENA_SIZE 64*1024 /* Must match the value in plugin-gcn.c. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
114 #define TEAM_ARENA_START 16 /* LDS offset of free pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
115 #define TEAM_ARENA_FREE 24 /* LDS offset of free pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
116 #define TEAM_ARENA_END 32 /* LDS offset of end pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
117
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
118 static inline void * __attribute__((malloc))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
119 team_malloc (size_t size)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
120 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
121 /* 4-byte align the size. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
122 size = (size + 3) & ~3;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
123
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
124 /* Allocate directly from the arena.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
125 The compiler does not support DS atomics, yet. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
126 void *result;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
127 asm ("ds_add_rtn_u64 %0, %1, %2\n\ts_waitcnt 0"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
128 : "=v"(result) : "v"(TEAM_ARENA_FREE), "v"(size), "e"(1L) : "memory");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
129
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
130 /* Handle OOM. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
131 if (result + size > *(void * __lds *)TEAM_ARENA_END)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
132 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
133 /* While this is experimental, let's make sure we know when OOM
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
134 happens. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
135 const char msg[] = "GCN team arena exhausted\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
136 write (2, msg, sizeof(msg)-1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
137
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
138 /* Fall back to using the heap (slowly). */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
139 result = gomp_malloc (size);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
140 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
141 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
142 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
143
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
144 static inline void * __attribute__((malloc))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
145 team_malloc_cleared (size_t size)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
146 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
147 char *result = team_malloc (size);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
148
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
149 /* Clear the allocated memory. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
150 __builtin_memset (result, 0, size);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
151
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
152 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
153 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
154
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
155 static inline void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
156 team_free (void *ptr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
157 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
158 /* The whole arena is freed when the kernel exits.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
159 However, if we fell back to using heap then we should free it.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
160 It would be better if this function could be a no-op, but at least
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
161 LDS loads are cheap. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
162 if (ptr < *(void * __lds *)TEAM_ARENA_START
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
163 || ptr >= *(void * __lds *)TEAM_ARENA_END)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
164 free (ptr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
165 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
166 #else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
167 #define team_malloc(...) gomp_malloc (__VA_ARGS__)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
168 #define team_malloc_cleared(...) gomp_malloc_cleared (__VA_ARGS__)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
169 #define team_free(...) free (__VA_ARGS__)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
170 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
171
111
kono
parents: 67
diff changeset
172 /* error.c */
kono
parents: 67
diff changeset
173
kono
parents: 67
diff changeset
174 extern void gomp_vdebug (int, const char *, va_list);
kono
parents: 67
diff changeset
175 extern void gomp_debug (int, const char *, ...)
kono
parents: 67
diff changeset
176 __attribute__ ((format (printf, 2, 3)));
kono
parents: 67
diff changeset
177 #define gomp_vdebug(KIND, FMT, VALIST) \
kono
parents: 67
diff changeset
178 do { \
kono
parents: 67
diff changeset
179 if (__builtin_expect (gomp_debug_var, 0)) \
kono
parents: 67
diff changeset
180 (gomp_vdebug) ((KIND), (FMT), (VALIST)); \
kono
parents: 67
diff changeset
181 } while (0)
kono
parents: 67
diff changeset
182 #define gomp_debug(KIND, ...) \
kono
parents: 67
diff changeset
183 do { \
kono
parents: 67
diff changeset
184 if (__builtin_expect (gomp_debug_var, 0)) \
kono
parents: 67
diff changeset
185 (gomp_debug) ((KIND), __VA_ARGS__); \
kono
parents: 67
diff changeset
186 } while (0)
kono
parents: 67
diff changeset
187 extern void gomp_verror (const char *, va_list);
kono
parents: 67
diff changeset
188 extern void gomp_error (const char *, ...)
kono
parents: 67
diff changeset
189 __attribute__ ((format (printf, 1, 2)));
kono
parents: 67
diff changeset
190 extern void gomp_vfatal (const char *, va_list)
kono
parents: 67
diff changeset
191 __attribute__ ((noreturn));
kono
parents: 67
diff changeset
192 extern void gomp_fatal (const char *, ...)
kono
parents: 67
diff changeset
193 __attribute__ ((noreturn, format (printf, 1, 2)));
kono
parents: 67
diff changeset
194
kono
parents: 67
diff changeset
195 struct gomp_task;
kono
parents: 67
diff changeset
196 struct gomp_taskgroup;
kono
parents: 67
diff changeset
197 struct htab;
kono
parents: 67
diff changeset
198
kono
parents: 67
diff changeset
199 #include "priority_queue.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 #include "sem.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 #include "mutex.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 #include "bar.h"
111
kono
parents: 67
diff changeset
203 #include "simple-bar.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 #include "ptrlock.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 /* 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
208 either a LOOP (FOR/DO) or a SECTIONS. */
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 enum gomp_schedule_type
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 GFS_RUNTIME,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 GFS_STATIC,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 GFS_DYNAMIC,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 GFS_GUIDED,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
216 GFS_AUTO,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
217 GFS_MONOTONIC = 0x80000000U
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219
111
kono
parents: 67
diff changeset
220 struct gomp_doacross_work_share
kono
parents: 67
diff changeset
221 {
kono
parents: 67
diff changeset
222 union {
kono
parents: 67
diff changeset
223 /* chunk_size copy, as ws->chunk_size is multiplied by incr for
kono
parents: 67
diff changeset
224 GFS_DYNAMIC. */
kono
parents: 67
diff changeset
225 long chunk_size;
kono
parents: 67
diff changeset
226 /* Likewise, but for ull implementation. */
kono
parents: 67
diff changeset
227 unsigned long long chunk_size_ull;
kono
parents: 67
diff changeset
228 /* For schedule(static,0) this is the number
kono
parents: 67
diff changeset
229 of iterations assigned to the last thread, i.e. number of
kono
parents: 67
diff changeset
230 iterations / number of threads. */
kono
parents: 67
diff changeset
231 long q;
kono
parents: 67
diff changeset
232 /* Likewise, but for ull implementation. */
kono
parents: 67
diff changeset
233 unsigned long long q_ull;
kono
parents: 67
diff changeset
234 };
kono
parents: 67
diff changeset
235 /* Size of each array entry (padded to cache line size). */
kono
parents: 67
diff changeset
236 unsigned long elt_sz;
kono
parents: 67
diff changeset
237 /* Number of dimensions in sink vectors. */
kono
parents: 67
diff changeset
238 unsigned int ncounts;
kono
parents: 67
diff changeset
239 /* True if the iterations can be flattened. */
kono
parents: 67
diff changeset
240 bool flattened;
kono
parents: 67
diff changeset
241 /* Actual array (of elt_sz sized units), aligned to cache line size.
kono
parents: 67
diff changeset
242 This is indexed by team_id for GFS_STATIC and outermost iteration
kono
parents: 67
diff changeset
243 / chunk_size for other schedules. */
kono
parents: 67
diff changeset
244 unsigned char *array;
kono
parents: 67
diff changeset
245 /* These two are only used for schedule(static,0). */
kono
parents: 67
diff changeset
246 /* This one is number of iterations % number of threads. */
kono
parents: 67
diff changeset
247 long t;
kono
parents: 67
diff changeset
248 union {
kono
parents: 67
diff changeset
249 /* And this one is cached t * (q + 1). */
kono
parents: 67
diff changeset
250 long boundary;
kono
parents: 67
diff changeset
251 /* Likewise, but for the ull implementation. */
kono
parents: 67
diff changeset
252 unsigned long long boundary_ull;
kono
parents: 67
diff changeset
253 };
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
254 /* Pointer to extra memory if needed for lastprivate(conditional). */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
255 void *extra;
111
kono
parents: 67
diff changeset
256 /* Array of shift counts for each dimension if they can be flattened. */
kono
parents: 67
diff changeset
257 unsigned int shift_counts[];
kono
parents: 67
diff changeset
258 };
kono
parents: 67
diff changeset
259
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 struct gomp_work_share
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 /* 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
263 The user specification of "runtime" will already have been resolved.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 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
265 enum gomp_schedule_type sched;
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 int mode;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 union {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 struct {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 /* This is the chunk_size argument to the SCHEDULE clause. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 long chunk_size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 /* 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
275 this is the number of contained sections. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 long end;
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 /* 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
279 is always 1. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 long incr;
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 struct {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 /* 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
285 unsigned long long chunk_size_ull;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 unsigned long long end_ull;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 unsigned long long incr_ull;
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 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290
111
kono
parents: 67
diff changeset
291 union {
kono
parents: 67
diff changeset
292 /* This is a circular queue that details which threads will be allowed
kono
parents: 67
diff changeset
293 into the ordered region and in which order. When a thread allocates
kono
parents: 67
diff changeset
294 iterations on which it is going to work, it also registers itself at
kono
parents: 67
diff changeset
295 the end of the array. When a thread reaches the ordered region, it
kono
parents: 67
diff changeset
296 checks to see if it is the one at the head of the queue. If not, it
kono
parents: 67
diff changeset
297 blocks on its RELEASE semaphore. */
kono
parents: 67
diff changeset
298 unsigned *ordered_team_ids;
kono
parents: 67
diff changeset
299
kono
parents: 67
diff changeset
300 /* This is a pointer to DOACROSS work share data. */
kono
parents: 67
diff changeset
301 struct gomp_doacross_work_share *doacross;
kono
parents: 67
diff changeset
302 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 /* This is the number of threads that have registered themselves in
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 the circular queue ordered_team_ids. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 unsigned ordered_num_used;
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 /* 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
309 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
310 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
311 to take the section next. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 unsigned ordered_owner;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
313
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 /* 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
315 current thread that's allowed into the ordered reason. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 unsigned ordered_cur;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
317
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 /* 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
319 in the first gomp_work_share struct in the block. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 struct gomp_work_share *next_alloc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 /* The above fields are written once during workshare initialization,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323 or related to ordered worksharing. Make sure the following fields
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 are in a different cache line. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 /* This lock protects the update of the following members. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 gomp_mutex_t lock __attribute__((aligned (64)));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
328
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 /* 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
330 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
331 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
332 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
333 unsigned threads_completed;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
334
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 union {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 /* 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
337 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
338 long next;
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 /* The same, but with unsigned long long type. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 unsigned long long next_ull;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 /* This is the returned data structure for SINGLE COPYPRIVATE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 void *copyprivate;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
345 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 union {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 /* 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
349 encountered after this one. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 gomp_ptrlock_t next_ws;
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 /* 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
353 through this. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 struct gomp_work_share *next_free;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
357 /* Task reductions for this work-sharing construct. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
358 uintptr_t *task_reductions;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
359
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 /* 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
361 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
362 unsigned inline_ordered_team_ids[0];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
365 /* 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
366 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
367 encounters a nested PARALLEL construct. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
368
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
369 struct gomp_team_state
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 /* 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
372 struct gomp_team *team;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 /* 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
375 processing. Recall that with NOWAIT, not all threads may be
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
376 processing the same construct. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 struct gomp_work_share *work_share;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
378
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 /* 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
380 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
381 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
382 next_ws field is used. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 struct gomp_work_share *last_work_share;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
384
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 /* 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
386 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
387 threads in the team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
388 unsigned team_id;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
390 /* Nesting level. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 unsigned level;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
392
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 /* Active nesting level. Only active parallel regions are counted. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
394 unsigned active_level;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
395
111
kono
parents: 67
diff changeset
396 /* Place-partition-var, offset and length into gomp_places_list array. */
kono
parents: 67
diff changeset
397 unsigned place_partition_off;
kono
parents: 67
diff changeset
398 unsigned place_partition_len;
kono
parents: 67
diff changeset
399
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 #ifdef HAVE_SYNC_BUILTINS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
401 /* Number of single stmts encountered. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 unsigned long single_count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
403 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
404
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 /* 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
406 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
407 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
408 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
409 the loop is statically scheduled. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 unsigned long static_trip;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
412
111
kono
parents: 67
diff changeset
413 struct target_mem_desc;
kono
parents: 67
diff changeset
414
kono
parents: 67
diff changeset
415 /* 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
416 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
417 stored within the structure; those described as having one copy
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 for the whole program are (naturally) global variables. */
111
kono
parents: 67
diff changeset
419
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 struct gomp_task_icv
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 unsigned long nthreads_var;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 enum gomp_schedule_type run_sched_var;
111
kono
parents: 67
diff changeset
424 int run_sched_chunk_size;
kono
parents: 67
diff changeset
425 int default_device_var;
kono
parents: 67
diff changeset
426 unsigned int thread_limit_var;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 bool dyn_var;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 bool nest_var;
111
kono
parents: 67
diff changeset
429 char bind_var;
kono
parents: 67
diff changeset
430 /* Internal ICV. */
kono
parents: 67
diff changeset
431 struct target_mem_desc *target_data;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
433
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 extern struct gomp_task_icv gomp_global_icv;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 #ifndef HAVE_SYNC_BUILTINS
111
kono
parents: 67
diff changeset
436 extern gomp_mutex_t gomp_managed_threads_lock;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 extern unsigned long gomp_max_active_levels_var;
111
kono
parents: 67
diff changeset
439 extern bool gomp_cancel_var;
kono
parents: 67
diff changeset
440 extern int gomp_max_task_priority_var;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 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
442 extern unsigned long gomp_available_cpus, gomp_managed_threads;
111
kono
parents: 67
diff changeset
443 extern unsigned long *gomp_nthreads_var_list, gomp_nthreads_var_list_len;
kono
parents: 67
diff changeset
444 extern char *gomp_bind_var_list;
kono
parents: 67
diff changeset
445 extern unsigned long gomp_bind_var_list_len;
kono
parents: 67
diff changeset
446 extern void **gomp_places_list;
kono
parents: 67
diff changeset
447 extern unsigned long gomp_places_list_len;
kono
parents: 67
diff changeset
448 extern unsigned int gomp_num_teams_var;
kono
parents: 67
diff changeset
449 extern int gomp_debug_var;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
450 extern bool gomp_display_affinity_var;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
451 extern char *gomp_affinity_format_var;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
452 extern size_t gomp_affinity_format_len;
111
kono
parents: 67
diff changeset
453 extern int goacc_device_num;
kono
parents: 67
diff changeset
454 extern char *goacc_device_type;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
455 extern int goacc_default_dims[GOMP_DIM_MAX];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
456
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 enum gomp_task_kind
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 {
111
kono
parents: 67
diff changeset
459 /* Implicit task. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 GOMP_TASK_IMPLICIT,
111
kono
parents: 67
diff changeset
461 /* Undeferred task. */
kono
parents: 67
diff changeset
462 GOMP_TASK_UNDEFERRED,
kono
parents: 67
diff changeset
463 /* 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
464 GOMP_TASK_WAITING,
111
kono
parents: 67
diff changeset
465 /* Task currently executing or scheduled and about to execute. */
kono
parents: 67
diff changeset
466 GOMP_TASK_TIED,
kono
parents: 67
diff changeset
467 /* Used for target tasks that have vars mapped and async run started,
kono
parents: 67
diff changeset
468 but not yet completed. Once that completes, they will be readded
kono
parents: 67
diff changeset
469 into the queues as GOMP_TASK_WAITING in order to perform the var
kono
parents: 67
diff changeset
470 unmapping. */
kono
parents: 67
diff changeset
471 GOMP_TASK_ASYNC_RUNNING
kono
parents: 67
diff changeset
472 };
kono
parents: 67
diff changeset
473
kono
parents: 67
diff changeset
474 struct gomp_task_depend_entry
kono
parents: 67
diff changeset
475 {
kono
parents: 67
diff changeset
476 /* Address of dependency. */
kono
parents: 67
diff changeset
477 void *addr;
kono
parents: 67
diff changeset
478 struct gomp_task_depend_entry *next;
kono
parents: 67
diff changeset
479 struct gomp_task_depend_entry *prev;
kono
parents: 67
diff changeset
480 /* Task that provides the dependency in ADDR. */
kono
parents: 67
diff changeset
481 struct gomp_task *task;
kono
parents: 67
diff changeset
482 /* Depend entry is of type "IN". */
kono
parents: 67
diff changeset
483 bool is_in;
kono
parents: 67
diff changeset
484 bool redundant;
kono
parents: 67
diff changeset
485 bool redundant_out;
kono
parents: 67
diff changeset
486 };
kono
parents: 67
diff changeset
487
kono
parents: 67
diff changeset
488 struct gomp_dependers_vec
kono
parents: 67
diff changeset
489 {
kono
parents: 67
diff changeset
490 size_t n_elem;
kono
parents: 67
diff changeset
491 size_t allocated;
kono
parents: 67
diff changeset
492 struct gomp_task *elem[];
kono
parents: 67
diff changeset
493 };
kono
parents: 67
diff changeset
494
kono
parents: 67
diff changeset
495 /* Used when in GOMP_taskwait or in gomp_task_maybe_wait_for_dependencies. */
kono
parents: 67
diff changeset
496
kono
parents: 67
diff changeset
497 struct gomp_taskwait
kono
parents: 67
diff changeset
498 {
kono
parents: 67
diff changeset
499 bool in_taskwait;
kono
parents: 67
diff changeset
500 bool in_depend_wait;
kono
parents: 67
diff changeset
501 /* Number of tasks we are waiting for. */
kono
parents: 67
diff changeset
502 size_t n_depend;
kono
parents: 67
diff changeset
503 gomp_sem_t taskwait_sem;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
505
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
506 /* 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
507
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 struct gomp_task
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
509 {
111
kono
parents: 67
diff changeset
510 /* Parent of this task. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 struct gomp_task *parent;
111
kono
parents: 67
diff changeset
512 /* Children of this task. */
kono
parents: 67
diff changeset
513 struct priority_queue children_queue;
kono
parents: 67
diff changeset
514 /* Taskgroup this task belongs in. */
kono
parents: 67
diff changeset
515 struct gomp_taskgroup *taskgroup;
kono
parents: 67
diff changeset
516 /* Tasks that depend on this task. */
kono
parents: 67
diff changeset
517 struct gomp_dependers_vec *dependers;
kono
parents: 67
diff changeset
518 struct htab *depend_hash;
kono
parents: 67
diff changeset
519 struct gomp_taskwait *taskwait;
kono
parents: 67
diff changeset
520 /* Number of items in DEPEND. */
kono
parents: 67
diff changeset
521 size_t depend_count;
kono
parents: 67
diff changeset
522 /* Number of tasks this task depends on. Once this counter reaches
kono
parents: 67
diff changeset
523 0, we have no unsatisfied dependencies, and this task can be put
kono
parents: 67
diff changeset
524 into the various queues to be scheduled. */
kono
parents: 67
diff changeset
525 size_t num_dependees;
kono
parents: 67
diff changeset
526
kono
parents: 67
diff changeset
527 /* Priority of this task. */
kono
parents: 67
diff changeset
528 int priority;
kono
parents: 67
diff changeset
529 /* The priority node for this task in each of the different queues.
kono
parents: 67
diff changeset
530 We put this here to avoid allocating space for each priority
kono
parents: 67
diff changeset
531 node. Then we play offsetof() games to convert between pnode[]
kono
parents: 67
diff changeset
532 entries and the gomp_task in which they reside. */
kono
parents: 67
diff changeset
533 struct priority_node pnode[3];
kono
parents: 67
diff changeset
534
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
535 struct gomp_task_icv icv;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
536 void (*fn) (void *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
537 void *fn_data;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
538 enum gomp_task_kind kind;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
539 bool in_tied_task;
111
kono
parents: 67
diff changeset
540 bool final_task;
kono
parents: 67
diff changeset
541 bool copy_ctors_done;
kono
parents: 67
diff changeset
542 /* Set for undeferred tasks with unsatisfied dependencies which
kono
parents: 67
diff changeset
543 block further execution of their parent until the dependencies
kono
parents: 67
diff changeset
544 are satisfied. */
kono
parents: 67
diff changeset
545 bool parent_depends_on;
kono
parents: 67
diff changeset
546 /* Dependencies provided and/or needed for this task. DEPEND_COUNT
kono
parents: 67
diff changeset
547 is the number of items available. */
kono
parents: 67
diff changeset
548 struct gomp_task_depend_entry depend[];
kono
parents: 67
diff changeset
549 };
kono
parents: 67
diff changeset
550
kono
parents: 67
diff changeset
551 /* This structure describes a single #pragma omp taskgroup. */
kono
parents: 67
diff changeset
552
kono
parents: 67
diff changeset
553 struct gomp_taskgroup
kono
parents: 67
diff changeset
554 {
kono
parents: 67
diff changeset
555 struct gomp_taskgroup *prev;
kono
parents: 67
diff changeset
556 /* Queue of tasks that belong in this taskgroup. */
kono
parents: 67
diff changeset
557 struct priority_queue taskgroup_queue;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
558 uintptr_t *reductions;
111
kono
parents: 67
diff changeset
559 bool in_taskgroup_wait;
kono
parents: 67
diff changeset
560 bool cancelled;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
561 bool workshare;
111
kono
parents: 67
diff changeset
562 gomp_sem_t taskgroup_sem;
kono
parents: 67
diff changeset
563 size_t num_children;
kono
parents: 67
diff changeset
564 };
kono
parents: 67
diff changeset
565
kono
parents: 67
diff changeset
566 /* Various state of OpenMP async offloading tasks. */
kono
parents: 67
diff changeset
567 enum gomp_target_task_state
kono
parents: 67
diff changeset
568 {
kono
parents: 67
diff changeset
569 GOMP_TARGET_TASK_DATA,
kono
parents: 67
diff changeset
570 GOMP_TARGET_TASK_BEFORE_MAP,
kono
parents: 67
diff changeset
571 GOMP_TARGET_TASK_FALLBACK,
kono
parents: 67
diff changeset
572 GOMP_TARGET_TASK_READY_TO_RUN,
kono
parents: 67
diff changeset
573 GOMP_TARGET_TASK_RUNNING,
kono
parents: 67
diff changeset
574 GOMP_TARGET_TASK_FINISHED
kono
parents: 67
diff changeset
575 };
kono
parents: 67
diff changeset
576
kono
parents: 67
diff changeset
577 /* This structure describes a target task. */
kono
parents: 67
diff changeset
578
kono
parents: 67
diff changeset
579 struct gomp_target_task
kono
parents: 67
diff changeset
580 {
kono
parents: 67
diff changeset
581 struct gomp_device_descr *devicep;
kono
parents: 67
diff changeset
582 void (*fn) (void *);
kono
parents: 67
diff changeset
583 size_t mapnum;
kono
parents: 67
diff changeset
584 size_t *sizes;
kono
parents: 67
diff changeset
585 unsigned short *kinds;
kono
parents: 67
diff changeset
586 unsigned int flags;
kono
parents: 67
diff changeset
587 enum gomp_target_task_state state;
kono
parents: 67
diff changeset
588 struct target_mem_desc *tgt;
kono
parents: 67
diff changeset
589 struct gomp_task *task;
kono
parents: 67
diff changeset
590 struct gomp_team *team;
kono
parents: 67
diff changeset
591 /* Device-specific target arguments. */
kono
parents: 67
diff changeset
592 void **args;
kono
parents: 67
diff changeset
593 void *hostaddrs[];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
594 };
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 structure describes a "team" of threads. These are the threads
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 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
598 constructs that the team encounters. */
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 struct gomp_team
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
601 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
602 /* This is the number of threads in the current team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
603 unsigned nthreads;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
604
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
605 /* 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
606 as a block last time. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
607 unsigned work_share_chunk;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
608
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
609 /* This 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
610 the current thread was created. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
611 struct gomp_team_state prev_ts;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
612
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
613 /* 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
614 "native" semaphore in the thread structure. Required for nested
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
615 parallels, as the master is a member of two teams. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
616 gomp_sem_t master_release;
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 /* 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
619 of the threads in the team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
620 gomp_sem_t **ordered_release;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
621
111
kono
parents: 67
diff changeset
622 /* List of work shares on which gomp_fini_work_share hasn't been
kono
parents: 67
diff changeset
623 called yet. If the team hasn't been cancelled, this should be
kono
parents: 67
diff changeset
624 equal to each thr->ts.work_share, but otherwise it can be a possibly
kono
parents: 67
diff changeset
625 long list of workshares. */
kono
parents: 67
diff changeset
626 struct gomp_work_share *work_shares_to_free;
kono
parents: 67
diff changeset
627
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
628 /* 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
629 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
630 team encountering a new work sharing construct, in a critical
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
631 section. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
632 struct gomp_work_share *work_share_list_alloc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
633
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
634 /* 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
635 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
636 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
637 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
638 with alloc_work_share. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
639 struct gomp_work_share *work_share_list_free;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
640
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
641 #ifdef HAVE_SYNC_BUILTINS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
642 /* Number of simple single regions encountered by threads in this
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
643 team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
644 unsigned long single_count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
645 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
646 /* Mutex protecting addition of workshares to work_share_list_free. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
647 gomp_mutex_t work_share_list_free_lock;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
648 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
649
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
650 /* This barrier is used for most synchronization of the team. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
651 gomp_barrier_t barrier;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
652
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
653 /* Initial work shares, to avoid allocating any gomp_work_share
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
654 structs in the common case. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
655 struct gomp_work_share work_shares[8];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
656
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
657 gomp_mutex_t task_lock;
111
kono
parents: 67
diff changeset
658 /* Scheduled tasks. */
kono
parents: 67
diff changeset
659 struct priority_queue task_queue;
kono
parents: 67
diff changeset
660 /* Number of all GOMP_TASK_{WAITING,TIED} tasks in the team. */
kono
parents: 67
diff changeset
661 unsigned int task_count;
kono
parents: 67
diff changeset
662 /* Number of GOMP_TASK_WAITING tasks currently waiting to be scheduled. */
kono
parents: 67
diff changeset
663 unsigned int task_queued_count;
kono
parents: 67
diff changeset
664 /* Number of GOMP_TASK_{WAITING,TIED} tasks currently running
kono
parents: 67
diff changeset
665 directly in gomp_barrier_handle_tasks; tasks spawned
kono
parents: 67
diff changeset
666 from e.g. GOMP_taskwait or GOMP_taskgroup_end don't count, even when
kono
parents: 67
diff changeset
667 that is called from a task run from gomp_barrier_handle_tasks.
kono
parents: 67
diff changeset
668 task_running_count should be always <= team->nthreads,
kono
parents: 67
diff changeset
669 and if current task isn't in_tied_task, then it will be
kono
parents: 67
diff changeset
670 even < team->nthreads. */
kono
parents: 67
diff changeset
671 unsigned int task_running_count;
kono
parents: 67
diff changeset
672 int work_share_cancelled;
kono
parents: 67
diff changeset
673 int team_cancelled;
0
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 /* This array contains structures for implicit tasks. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
676 struct gomp_task implicit_task[];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
677 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
678
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 /* 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
680 allocated per thread. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
681
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
682 struct gomp_thread
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
683 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
684 /* 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
685 void (*fn) (void *data);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
686 void *data;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
687
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
688 /* 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
689 is NULL only if the thread is idle. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
690 struct gomp_team_state ts;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
691
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
692 /* This is the task that the thread is currently executing. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
693 struct gomp_task *task;
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 /* This semaphore is used for ordered loops. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
696 gomp_sem_t release;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
697
111
kono
parents: 67
diff changeset
698 /* Place this thread is bound to plus one, or zero if not bound
kono
parents: 67
diff changeset
699 to any place. */
kono
parents: 67
diff changeset
700 unsigned int place;
kono
parents: 67
diff changeset
701
kono
parents: 67
diff changeset
702 /* User pthread thread pool */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
703 struct gomp_thread_pool *thread_pool;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
704
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
705 #if defined(LIBGOMP_USE_PTHREADS) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
706 && (!defined(HAVE_TLS) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
707 || !defined(__GLIBC__) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
708 || !defined(USING_INITIAL_EXEC_TLS))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
709 /* pthread_t of the thread containing this gomp_thread.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
710 On Linux when using initial-exec TLS,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
711 (typeof (pthread_t)) gomp_thread () - pthread_self ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
712 is constant in all threads, so we can optimize and not
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
713 store it. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
714 #define GOMP_NEEDS_THREAD_HANDLE 1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
715 pthread_t handle;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
716 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
717 };
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
720 struct gomp_thread_pool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
721 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
722 /* 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
723 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
724 struct gomp_thread **threads;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
725 unsigned threads_size;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
726 unsigned threads_used;
111
kono
parents: 67
diff changeset
727 /* The last team is used for non-nested teams to delay their destruction to
kono
parents: 67
diff changeset
728 make sure all the threads in the team move on to the pool's barrier before
kono
parents: 67
diff changeset
729 the team's barrier is destroyed. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
730 struct gomp_team *last_team;
111
kono
parents: 67
diff changeset
731 /* Number of threads running in this contention group. */
kono
parents: 67
diff changeset
732 unsigned long threads_busy;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
733
111
kono
parents: 67
diff changeset
734 /* This barrier holds and releases threads waiting in thread pools. */
kono
parents: 67
diff changeset
735 gomp_simple_barrier_t threads_dock;
kono
parents: 67
diff changeset
736 };
kono
parents: 67
diff changeset
737
kono
parents: 67
diff changeset
738 enum gomp_cancel_kind
kono
parents: 67
diff changeset
739 {
kono
parents: 67
diff changeset
740 GOMP_CANCEL_PARALLEL = 1,
kono
parents: 67
diff changeset
741 GOMP_CANCEL_LOOP = 2,
kono
parents: 67
diff changeset
742 GOMP_CANCEL_FOR = GOMP_CANCEL_LOOP,
kono
parents: 67
diff changeset
743 GOMP_CANCEL_DO = GOMP_CANCEL_LOOP,
kono
parents: 67
diff changeset
744 GOMP_CANCEL_SECTIONS = 4,
kono
parents: 67
diff changeset
745 GOMP_CANCEL_TASKGROUP = 8
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
746 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
747
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
748 /* ... and here is that TLS data. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
749
111
kono
parents: 67
diff changeset
750 #if defined __nvptx__
kono
parents: 67
diff changeset
751 extern struct gomp_thread *nvptx_thrs __attribute__((shared));
kono
parents: 67
diff changeset
752 static inline struct gomp_thread *gomp_thread (void)
kono
parents: 67
diff changeset
753 {
kono
parents: 67
diff changeset
754 int tid;
kono
parents: 67
diff changeset
755 asm ("mov.u32 %0, %%tid.y;" : "=r" (tid));
kono
parents: 67
diff changeset
756 return nvptx_thrs + tid;
kono
parents: 67
diff changeset
757 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
758 #elif defined __AMDGCN__
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
759 static inline struct gomp_thread *gcn_thrs (void)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
760 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
761 /* The value is at the bottom of LDS. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
762 struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
763 return *thrs;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
764 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
765 static inline void set_gcn_thrs (struct gomp_thread *val)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
766 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
767 /* The value is at the bottom of LDS. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
768 struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
769 *thrs = val;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
771 static inline struct gomp_thread *gomp_thread (void)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
772 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
773 int tid = __builtin_gcn_dim_pos(1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
774 return gcn_thrs () + tid;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
775 }
111
kono
parents: 67
diff changeset
776 #elif defined HAVE_TLS || defined USE_EMUTLS
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
777 extern __thread struct gomp_thread gomp_tls_data;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
778 static inline struct gomp_thread *gomp_thread (void)
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 return &gomp_tls_data;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
781 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
782 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
783 extern pthread_key_t gomp_tls_key;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
784 static inline struct gomp_thread *gomp_thread (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
785 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
786 return pthread_getspecific (gomp_tls_key);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
787 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
788 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
789
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
790 extern struct gomp_task_icv *gomp_new_icv (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
791
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
792 /* 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
793
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
794 static inline struct gomp_task_icv *gomp_icv (bool write)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
795 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
796 struct gomp_task *task = gomp_thread ()->task;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
797 if (task)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
798 return &task->icv;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
799 else if (write)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
800 return gomp_new_icv ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
801 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
802 return &gomp_global_icv;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
803 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
804
111
kono
parents: 67
diff changeset
805 #ifdef LIBGOMP_USE_PTHREADS
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
806 /* The attributes to be used during thread creation. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
807 extern pthread_attr_t gomp_thread_attr;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
808
111
kono
parents: 67
diff changeset
809 extern pthread_key_t gomp_thread_destructor;
kono
parents: 67
diff changeset
810 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
811
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
812 /* Function prototypes. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
813
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
814 /* affinity.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
815
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
816 extern void gomp_init_affinity (void);
111
kono
parents: 67
diff changeset
817 #ifdef LIBGOMP_USE_PTHREADS
kono
parents: 67
diff changeset
818 extern void gomp_init_thread_affinity (pthread_attr_t *, unsigned int);
kono
parents: 67
diff changeset
819 #endif
kono
parents: 67
diff changeset
820 extern void **gomp_affinity_alloc (unsigned long, bool);
kono
parents: 67
diff changeset
821 extern void gomp_affinity_init_place (void *);
kono
parents: 67
diff changeset
822 extern bool gomp_affinity_add_cpus (void *, unsigned long, unsigned long,
kono
parents: 67
diff changeset
823 long, bool);
kono
parents: 67
diff changeset
824 extern bool gomp_affinity_remove_cpu (void *, unsigned long);
kono
parents: 67
diff changeset
825 extern bool gomp_affinity_copy_place (void *, void *, long);
kono
parents: 67
diff changeset
826 extern bool gomp_affinity_same_place (void *, void *);
kono
parents: 67
diff changeset
827 extern bool gomp_affinity_finalize_place_list (bool);
kono
parents: 67
diff changeset
828 extern bool gomp_affinity_init_level (int, unsigned long, bool);
kono
parents: 67
diff changeset
829 extern void gomp_affinity_print_place (void *);
kono
parents: 67
diff changeset
830 extern void gomp_get_place_proc_ids_8 (int, int64_t *);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
831 extern void gomp_display_affinity_place (char *, size_t, size_t *, int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
832
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
833 /* affinity-fmt.c */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
834
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
835 extern bool gomp_print_string (const char *str, size_t len);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
836 extern void gomp_set_affinity_format (const char *, size_t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
837 extern void gomp_display_string (char *, size_t, size_t *, const char *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
838 size_t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
839 #ifdef LIBGOMP_USE_PTHREADS
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
840 typedef pthread_t gomp_thread_handle;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
841 #else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
842 typedef struct {} gomp_thread_handle;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
843 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
844 extern size_t gomp_display_affinity (char *, size_t, const char *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
845 gomp_thread_handle,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
846 struct gomp_team_state *, unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
847 extern void gomp_display_affinity_thread (gomp_thread_handle,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
848 struct gomp_team_state *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
849 unsigned int) __attribute__((cold));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
850
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
851 /* iter.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
852
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
853 extern int gomp_iter_static_next (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
854 extern bool gomp_iter_dynamic_next_locked (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
855 extern bool gomp_iter_guided_next_locked (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
856
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
857 #ifdef HAVE_SYNC_BUILTINS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
858 extern bool gomp_iter_dynamic_next (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
859 extern bool gomp_iter_guided_next (long *, long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
860 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
861
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
862 /* iter_ull.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
863
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
864 extern int gomp_iter_ull_static_next (unsigned long long *,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
865 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
866 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
867 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
868 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
869 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
870
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
871 #if defined HAVE_SYNC_BUILTINS && defined __LP64__
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
872 extern bool gomp_iter_ull_dynamic_next (unsigned long long *,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
873 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
874 extern bool gomp_iter_ull_guided_next (unsigned long long *,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
875 unsigned long long *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
876 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
877
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
878 /* ordered.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
879
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
880 extern void gomp_ordered_first (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
881 extern void gomp_ordered_last (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
882 extern void gomp_ordered_next (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
883 extern void gomp_ordered_static_init (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
884 extern void gomp_ordered_static_next (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
885 extern void gomp_ordered_sync (void);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
886 extern void gomp_doacross_init (unsigned, long *, long, size_t);
111
kono
parents: 67
diff changeset
887 extern void gomp_doacross_ull_init (unsigned, unsigned long long *,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
888 unsigned long long, size_t);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
889
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
890 /* parallel.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
891
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
892 extern unsigned gomp_resolve_num_threads (unsigned, unsigned);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
893
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
894 /* proc.c (in config/) */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
895
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
896 extern void gomp_init_num_threads (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
897 extern unsigned gomp_dynamic_max_threads (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
898
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
899 /* task.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
900
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
901 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
902 struct gomp_task_icv *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
903 extern void gomp_end_task (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
904 extern void gomp_barrier_handle_tasks (gomp_barrier_state_t);
111
kono
parents: 67
diff changeset
905 extern void gomp_task_maybe_wait_for_dependencies (void **);
kono
parents: 67
diff changeset
906 extern bool gomp_create_target_task (struct gomp_device_descr *,
kono
parents: 67
diff changeset
907 void (*) (void *), size_t, void **,
kono
parents: 67
diff changeset
908 size_t *, unsigned short *, unsigned int,
kono
parents: 67
diff changeset
909 void **, void **,
kono
parents: 67
diff changeset
910 enum gomp_target_task_state);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
911 extern struct gomp_taskgroup *gomp_parallel_reduction_register (uintptr_t *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
912 unsigned);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
913 extern void gomp_workshare_taskgroup_start (void);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
914 extern void gomp_workshare_task_reduction_register (uintptr_t *, uintptr_t *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
915
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
916 static void inline
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
917 gomp_finish_task (struct gomp_task *task)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
918 {
111
kono
parents: 67
diff changeset
919 if (__builtin_expect (task->depend_hash != NULL, 0))
kono
parents: 67
diff changeset
920 free (task->depend_hash);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
921 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
922
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
923 /* team.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
924
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
925 extern struct gomp_team *gomp_new_team (unsigned);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
926 extern void gomp_team_start (void (*) (void *), void *, unsigned,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
927 unsigned, struct gomp_team *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
928 struct gomp_taskgroup *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
929 extern void gomp_team_end (void);
111
kono
parents: 67
diff changeset
930 extern void gomp_free_thread (void *);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
931 extern int gomp_pause_host (void);
111
kono
parents: 67
diff changeset
932
kono
parents: 67
diff changeset
933 /* target.c */
kono
parents: 67
diff changeset
934
kono
parents: 67
diff changeset
935 extern void gomp_init_targets_once (void);
kono
parents: 67
diff changeset
936 extern int gomp_get_num_devices (void);
kono
parents: 67
diff changeset
937 extern bool gomp_target_task_fn (void *);
kono
parents: 67
diff changeset
938
kono
parents: 67
diff changeset
939 /* Splay tree definitions. */
kono
parents: 67
diff changeset
940 typedef struct splay_tree_node_s *splay_tree_node;
kono
parents: 67
diff changeset
941 typedef struct splay_tree_s *splay_tree;
kono
parents: 67
diff changeset
942 typedef struct splay_tree_key_s *splay_tree_key;
kono
parents: 67
diff changeset
943
kono
parents: 67
diff changeset
944 struct target_var_desc {
kono
parents: 67
diff changeset
945 /* Splay key. */
kono
parents: 67
diff changeset
946 splay_tree_key key;
kono
parents: 67
diff changeset
947 /* True if data should be copied from device to host at the end. */
kono
parents: 67
diff changeset
948 bool copy_from;
kono
parents: 67
diff changeset
949 /* True if data always should be copied from device to host at the end. */
kono
parents: 67
diff changeset
950 bool always_copy_from;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
951 /* True if variable should be detached at end of region. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
952 bool do_detach;
111
kono
parents: 67
diff changeset
953 /* Relative offset against key host_start. */
kono
parents: 67
diff changeset
954 uintptr_t offset;
kono
parents: 67
diff changeset
955 /* Actual length. */
kono
parents: 67
diff changeset
956 uintptr_t length;
kono
parents: 67
diff changeset
957 };
kono
parents: 67
diff changeset
958
kono
parents: 67
diff changeset
959 struct target_mem_desc {
kono
parents: 67
diff changeset
960 /* Reference count. */
kono
parents: 67
diff changeset
961 uintptr_t refcount;
kono
parents: 67
diff changeset
962 /* All the splay nodes allocated together. */
kono
parents: 67
diff changeset
963 splay_tree_node array;
kono
parents: 67
diff changeset
964 /* Start of the target region. */
kono
parents: 67
diff changeset
965 uintptr_t tgt_start;
kono
parents: 67
diff changeset
966 /* End of the targer region. */
kono
parents: 67
diff changeset
967 uintptr_t tgt_end;
kono
parents: 67
diff changeset
968 /* Handle to free. */
kono
parents: 67
diff changeset
969 void *to_free;
kono
parents: 67
diff changeset
970 /* Previous target_mem_desc. */
kono
parents: 67
diff changeset
971 struct target_mem_desc *prev;
kono
parents: 67
diff changeset
972 /* Number of items in following list. */
kono
parents: 67
diff changeset
973 size_t list_count;
kono
parents: 67
diff changeset
974
kono
parents: 67
diff changeset
975 /* Corresponding target device descriptor. */
kono
parents: 67
diff changeset
976 struct gomp_device_descr *device_descr;
kono
parents: 67
diff changeset
977
kono
parents: 67
diff changeset
978 /* List of target items to remove (or decrease refcount)
kono
parents: 67
diff changeset
979 at the end of region. */
kono
parents: 67
diff changeset
980 struct target_var_desc list[];
kono
parents: 67
diff changeset
981 };
kono
parents: 67
diff changeset
982
kono
parents: 67
diff changeset
983 /* Special value for refcount - infinity. */
kono
parents: 67
diff changeset
984 #define REFCOUNT_INFINITY (~(uintptr_t) 0)
kono
parents: 67
diff changeset
985 /* Special value for refcount - tgt_offset contains target address of the
kono
parents: 67
diff changeset
986 artificial pointer to "omp declare target link" object. */
kono
parents: 67
diff changeset
987 #define REFCOUNT_LINK (~(uintptr_t) 1)
kono
parents: 67
diff changeset
988
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
989 /* Special offset values. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
990 #define OFFSET_INLINED (~(uintptr_t) 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
991 #define OFFSET_POINTER (~(uintptr_t) 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
992 #define OFFSET_STRUCT (~(uintptr_t) 2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
993
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
994 /* Auxiliary structure for infrequently-used or API-specific data. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
995
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
996 struct splay_tree_aux {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
997 /* Pointer to the original mapping of "omp declare target link" object. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
998 splay_tree_key link_key;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
999 /* For a block with attached pointers, the attachment counters for each.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1000 Only used for OpenACC. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1001 uintptr_t *attach_count;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1002 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1003
111
kono
parents: 67
diff changeset
1004 struct splay_tree_key_s {
kono
parents: 67
diff changeset
1005 /* Address of the host object. */
kono
parents: 67
diff changeset
1006 uintptr_t host_start;
kono
parents: 67
diff changeset
1007 /* Address immediately after the host object. */
kono
parents: 67
diff changeset
1008 uintptr_t host_end;
kono
parents: 67
diff changeset
1009 /* Descriptor of the target memory. */
kono
parents: 67
diff changeset
1010 struct target_mem_desc *tgt;
kono
parents: 67
diff changeset
1011 /* Offset from tgt->tgt_start to the start of the target object. */
kono
parents: 67
diff changeset
1012 uintptr_t tgt_offset;
kono
parents: 67
diff changeset
1013 /* Reference count. */
kono
parents: 67
diff changeset
1014 uintptr_t refcount;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1015 /* Reference counts beyond those that represent genuine references in the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1016 linked splay tree key/target memory structures, e.g. for multiple OpenACC
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1017 "present increment" operations (via "acc enter data") referring to the same
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1018 host-memory block. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1019 uintptr_t virtual_refcount;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1020 struct splay_tree_aux *aux;
111
kono
parents: 67
diff changeset
1021 };
kono
parents: 67
diff changeset
1022
kono
parents: 67
diff changeset
1023 /* The comparison function. */
kono
parents: 67
diff changeset
1024
kono
parents: 67
diff changeset
1025 static inline int
kono
parents: 67
diff changeset
1026 splay_compare (splay_tree_key x, splay_tree_key y)
kono
parents: 67
diff changeset
1027 {
kono
parents: 67
diff changeset
1028 if (x->host_start == x->host_end
kono
parents: 67
diff changeset
1029 && y->host_start == y->host_end)
kono
parents: 67
diff changeset
1030 return 0;
kono
parents: 67
diff changeset
1031 if (x->host_end <= y->host_start)
kono
parents: 67
diff changeset
1032 return -1;
kono
parents: 67
diff changeset
1033 if (x->host_start >= y->host_end)
kono
parents: 67
diff changeset
1034 return 1;
kono
parents: 67
diff changeset
1035 return 0;
kono
parents: 67
diff changeset
1036 }
kono
parents: 67
diff changeset
1037
kono
parents: 67
diff changeset
1038 #include "splay-tree.h"
kono
parents: 67
diff changeset
1039
kono
parents: 67
diff changeset
1040 typedef struct acc_dispatch_t
kono
parents: 67
diff changeset
1041 {
kono
parents: 67
diff changeset
1042 /* Execute. */
kono
parents: 67
diff changeset
1043 __typeof (GOMP_OFFLOAD_openacc_exec) *exec_func;
kono
parents: 67
diff changeset
1044
kono
parents: 67
diff changeset
1045 /* Create/destroy TLS data. */
kono
parents: 67
diff changeset
1046 __typeof (GOMP_OFFLOAD_openacc_create_thread_data) *create_thread_data_func;
kono
parents: 67
diff changeset
1047 __typeof (GOMP_OFFLOAD_openacc_destroy_thread_data)
kono
parents: 67
diff changeset
1048 *destroy_thread_data_func;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1049
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1050 struct {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1051 /* Once created and put into the "active" list, asyncqueues are then never
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1052 destructed and removed from the "active" list, other than if the TODO
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1053 device is shut down. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1054 gomp_mutex_t lock;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1055 int nasyncqueue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1056 struct goacc_asyncqueue **asyncqueue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1057 struct goacc_asyncqueue_list *active;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1058
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1059 __typeof (GOMP_OFFLOAD_openacc_async_construct) *construct_func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1060 __typeof (GOMP_OFFLOAD_openacc_async_destruct) *destruct_func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1061 __typeof (GOMP_OFFLOAD_openacc_async_test) *test_func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1062 __typeof (GOMP_OFFLOAD_openacc_async_synchronize) *synchronize_func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1063 __typeof (GOMP_OFFLOAD_openacc_async_serialize) *serialize_func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1064 __typeof (GOMP_OFFLOAD_openacc_async_queue_callback) *queue_callback_func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1065
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1066 __typeof (GOMP_OFFLOAD_openacc_async_exec) *exec_func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1067 __typeof (GOMP_OFFLOAD_openacc_async_dev2host) *dev2host_func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1068 __typeof (GOMP_OFFLOAD_openacc_async_host2dev) *host2dev_func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1069 } async;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1070
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1071 __typeof (GOMP_OFFLOAD_openacc_get_property) *get_property_func;
111
kono
parents: 67
diff changeset
1072
kono
parents: 67
diff changeset
1073 /* NVIDIA target specific routines. */
kono
parents: 67
diff changeset
1074 struct {
kono
parents: 67
diff changeset
1075 __typeof (GOMP_OFFLOAD_openacc_cuda_get_current_device)
kono
parents: 67
diff changeset
1076 *get_current_device_func;
kono
parents: 67
diff changeset
1077 __typeof (GOMP_OFFLOAD_openacc_cuda_get_current_context)
kono
parents: 67
diff changeset
1078 *get_current_context_func;
kono
parents: 67
diff changeset
1079 __typeof (GOMP_OFFLOAD_openacc_cuda_get_stream) *get_stream_func;
kono
parents: 67
diff changeset
1080 __typeof (GOMP_OFFLOAD_openacc_cuda_set_stream) *set_stream_func;
kono
parents: 67
diff changeset
1081 } cuda;
kono
parents: 67
diff changeset
1082 } acc_dispatch_t;
kono
parents: 67
diff changeset
1083
kono
parents: 67
diff changeset
1084 /* Various state of the accelerator device. */
kono
parents: 67
diff changeset
1085 enum gomp_device_state
kono
parents: 67
diff changeset
1086 {
kono
parents: 67
diff changeset
1087 GOMP_DEVICE_UNINITIALIZED,
kono
parents: 67
diff changeset
1088 GOMP_DEVICE_INITIALIZED,
kono
parents: 67
diff changeset
1089 GOMP_DEVICE_FINALIZED
kono
parents: 67
diff changeset
1090 };
kono
parents: 67
diff changeset
1091
kono
parents: 67
diff changeset
1092 /* This structure describes accelerator device.
kono
parents: 67
diff changeset
1093 It contains name of the corresponding libgomp plugin, function handlers for
kono
parents: 67
diff changeset
1094 interaction with the device, ID-number of the device, and information about
kono
parents: 67
diff changeset
1095 mapped memory. */
kono
parents: 67
diff changeset
1096 struct gomp_device_descr
kono
parents: 67
diff changeset
1097 {
kono
parents: 67
diff changeset
1098 /* Immutable data, which is only set during initialization, and which is not
kono
parents: 67
diff changeset
1099 guarded by the lock. */
kono
parents: 67
diff changeset
1100
kono
parents: 67
diff changeset
1101 /* The name of the device. */
kono
parents: 67
diff changeset
1102 const char *name;
kono
parents: 67
diff changeset
1103
kono
parents: 67
diff changeset
1104 /* Capabilities of device (supports OpenACC, OpenMP). */
kono
parents: 67
diff changeset
1105 unsigned int capabilities;
kono
parents: 67
diff changeset
1106
kono
parents: 67
diff changeset
1107 /* This is the ID number of device among devices of the same type. */
kono
parents: 67
diff changeset
1108 int target_id;
kono
parents: 67
diff changeset
1109
kono
parents: 67
diff changeset
1110 /* This is the TYPE of device. */
kono
parents: 67
diff changeset
1111 enum offload_target_type type;
kono
parents: 67
diff changeset
1112
kono
parents: 67
diff changeset
1113 /* Function handlers. */
kono
parents: 67
diff changeset
1114 __typeof (GOMP_OFFLOAD_get_name) *get_name_func;
kono
parents: 67
diff changeset
1115 __typeof (GOMP_OFFLOAD_get_caps) *get_caps_func;
kono
parents: 67
diff changeset
1116 __typeof (GOMP_OFFLOAD_get_type) *get_type_func;
kono
parents: 67
diff changeset
1117 __typeof (GOMP_OFFLOAD_get_num_devices) *get_num_devices_func;
kono
parents: 67
diff changeset
1118 __typeof (GOMP_OFFLOAD_init_device) *init_device_func;
kono
parents: 67
diff changeset
1119 __typeof (GOMP_OFFLOAD_fini_device) *fini_device_func;
kono
parents: 67
diff changeset
1120 __typeof (GOMP_OFFLOAD_version) *version_func;
kono
parents: 67
diff changeset
1121 __typeof (GOMP_OFFLOAD_load_image) *load_image_func;
kono
parents: 67
diff changeset
1122 __typeof (GOMP_OFFLOAD_unload_image) *unload_image_func;
kono
parents: 67
diff changeset
1123 __typeof (GOMP_OFFLOAD_alloc) *alloc_func;
kono
parents: 67
diff changeset
1124 __typeof (GOMP_OFFLOAD_free) *free_func;
kono
parents: 67
diff changeset
1125 __typeof (GOMP_OFFLOAD_dev2host) *dev2host_func;
kono
parents: 67
diff changeset
1126 __typeof (GOMP_OFFLOAD_host2dev) *host2dev_func;
kono
parents: 67
diff changeset
1127 __typeof (GOMP_OFFLOAD_dev2dev) *dev2dev_func;
kono
parents: 67
diff changeset
1128 __typeof (GOMP_OFFLOAD_can_run) *can_run_func;
kono
parents: 67
diff changeset
1129 __typeof (GOMP_OFFLOAD_run) *run_func;
kono
parents: 67
diff changeset
1130 __typeof (GOMP_OFFLOAD_async_run) *async_run_func;
kono
parents: 67
diff changeset
1131
kono
parents: 67
diff changeset
1132 /* Splay tree containing information about mapped memory regions. */
kono
parents: 67
diff changeset
1133 struct splay_tree_s mem_map;
kono
parents: 67
diff changeset
1134
kono
parents: 67
diff changeset
1135 /* Mutex for the mutable data. */
kono
parents: 67
diff changeset
1136 gomp_mutex_t lock;
kono
parents: 67
diff changeset
1137
kono
parents: 67
diff changeset
1138 /* Current state of the device. OpenACC allows to move from INITIALIZED state
kono
parents: 67
diff changeset
1139 back to UNINITIALIZED state. OpenMP allows only to move from INITIALIZED
kono
parents: 67
diff changeset
1140 to FINALIZED state (at program shutdown). */
kono
parents: 67
diff changeset
1141 enum gomp_device_state state;
kono
parents: 67
diff changeset
1142
kono
parents: 67
diff changeset
1143 /* OpenACC-specific data and functions. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1144 /* This is mutable because of its mutable target_data member. */
111
kono
parents: 67
diff changeset
1145 acc_dispatch_t openacc;
kono
parents: 67
diff changeset
1146 };
kono
parents: 67
diff changeset
1147
kono
parents: 67
diff changeset
1148 /* Kind of the pragma, for which gomp_map_vars () is called. */
kono
parents: 67
diff changeset
1149 enum gomp_map_vars_kind
kono
parents: 67
diff changeset
1150 {
kono
parents: 67
diff changeset
1151 GOMP_MAP_VARS_OPENACC,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1152 GOMP_MAP_VARS_OPENACC_ENTER_DATA,
111
kono
parents: 67
diff changeset
1153 GOMP_MAP_VARS_TARGET,
kono
parents: 67
diff changeset
1154 GOMP_MAP_VARS_DATA,
kono
parents: 67
diff changeset
1155 GOMP_MAP_VARS_ENTER_DATA
kono
parents: 67
diff changeset
1156 };
kono
parents: 67
diff changeset
1157
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1158 extern void gomp_acc_declare_allocate (bool, size_t, void **, size_t *,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1159 unsigned short *);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1160 struct gomp_coalesce_buf;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1161 extern void gomp_copy_host2dev (struct gomp_device_descr *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1162 struct goacc_asyncqueue *, void *, const void *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1163 size_t, struct gomp_coalesce_buf *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1164 extern void gomp_copy_dev2host (struct gomp_device_descr *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1165 struct goacc_asyncqueue *, void *, const void *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1166 size_t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1167 extern uintptr_t gomp_map_val (struct target_mem_desc *, void **, size_t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1168 extern void gomp_attach_pointer (struct gomp_device_descr *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1169 struct goacc_asyncqueue *, splay_tree,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1170 splay_tree_key, uintptr_t, size_t,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1171 struct gomp_coalesce_buf *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1172 extern void gomp_detach_pointer (struct gomp_device_descr *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1173 struct goacc_asyncqueue *, splay_tree_key,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1174 uintptr_t, bool, struct gomp_coalesce_buf *);
111
kono
parents: 67
diff changeset
1175
kono
parents: 67
diff changeset
1176 extern struct target_mem_desc *gomp_map_vars (struct gomp_device_descr *,
kono
parents: 67
diff changeset
1177 size_t, void **, void **,
kono
parents: 67
diff changeset
1178 size_t *, void *, bool,
kono
parents: 67
diff changeset
1179 enum gomp_map_vars_kind);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1180 extern struct target_mem_desc *gomp_map_vars_async (struct gomp_device_descr *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1181 struct goacc_asyncqueue *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1182 size_t, void **, void **,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1183 size_t *, void *, bool,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1184 enum gomp_map_vars_kind);
111
kono
parents: 67
diff changeset
1185 extern void gomp_unmap_vars (struct target_mem_desc *, bool);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1186 extern void gomp_unmap_vars_async (struct target_mem_desc *, bool,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1187 struct goacc_asyncqueue *);
111
kono
parents: 67
diff changeset
1188 extern void gomp_init_device (struct gomp_device_descr *);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1189 extern bool gomp_fini_device (struct gomp_device_descr *);
111
kono
parents: 67
diff changeset
1190 extern void gomp_unload_device (struct gomp_device_descr *);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1191 extern bool gomp_remove_var (struct gomp_device_descr *, splay_tree_key);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1192 extern void gomp_remove_var_async (struct gomp_device_descr *, splay_tree_key,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1193 struct goacc_asyncqueue *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1194
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1195 /* work.c */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1196
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1197 extern void gomp_init_work_share (struct gomp_work_share *, size_t, unsigned);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1198 extern void gomp_fini_work_share (struct gomp_work_share *);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1199 extern bool gomp_work_share_start (size_t);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1200 extern void gomp_work_share_end (void);
111
kono
parents: 67
diff changeset
1201 extern bool gomp_work_share_end_cancel (void);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1202 extern void gomp_work_share_end_nowait (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1203
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1204 static inline void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1205 gomp_work_share_init_done (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1206 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1207 struct gomp_thread *thr = gomp_thread ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1208 if (__builtin_expect (thr->ts.last_work_share != NULL, 1))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1209 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
1210 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1211
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1212 #ifdef HAVE_ATTRIBUTE_VISIBILITY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1213 # pragma GCC visibility pop
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1214 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1215
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1216 /* 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
1217 #include "libgomp_g.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1218
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1219 /* Include omp.h by parts. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1220 #include "omp-lock.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1221 #define _LIBGOMP_OMP_LOCK_DEFINED 1
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1222 #include "omp.h.in"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1223
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1224 #if !defined (HAVE_ATTRIBUTE_VISIBILITY) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1225 || !defined (HAVE_ATTRIBUTE_ALIAS) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1226 || !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
1227 || !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
1228 || !defined (HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1229 # undef LIBGOMP_GNU_SYMBOL_VERSIONING
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1230 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1231
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1232 #ifdef LIBGOMP_GNU_SYMBOL_VERSIONING
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1233 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
1234 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
1235 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
1236 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
1237 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
1238 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
1239 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
1240 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
1241 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
1242 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
1243
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1244 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
1245 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
1246 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
1247 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
1248 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
1249 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
1250 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
1251 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
1252 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
1253 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
1254
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1255 # define omp_lock_symver(fn) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1256 __asm (".symver g" #fn "_30, " #fn "@@OMP_3.0"); \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1257 __asm (".symver g" #fn "_25, " #fn "@OMP_1.0");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1258 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1259 # define gomp_init_lock_30 omp_init_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1260 # define gomp_destroy_lock_30 omp_destroy_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1261 # define gomp_set_lock_30 omp_set_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1262 # define gomp_unset_lock_30 omp_unset_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1263 # define gomp_test_lock_30 omp_test_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1264 # define gomp_init_nest_lock_30 omp_init_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1265 # define gomp_destroy_nest_lock_30 omp_destroy_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1266 # define gomp_set_nest_lock_30 omp_set_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1267 # define gomp_unset_nest_lock_30 omp_unset_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1268 # define gomp_test_nest_lock_30 omp_test_nest_lock
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1269 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1270
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1271 #ifdef HAVE_ATTRIBUTE_VISIBILITY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1272 # define attribute_hidden __attribute__ ((visibility ("hidden")))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1273 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1274 # define attribute_hidden
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1275 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1276
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1277 #if __GNUC__ >= 9
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1278 # define HAVE_ATTRIBUTE_COPY
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1279 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1280
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1281 #ifdef HAVE_ATTRIBUTE_COPY
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1282 # define attribute_copy(arg) __attribute__ ((copy (arg)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1283 #else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1284 # define attribute_copy(arg)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1285 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1286
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1287 #ifdef HAVE_ATTRIBUTE_ALIAS
111
kono
parents: 67
diff changeset
1288 # define strong_alias(fn, al) \
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1289 extern __typeof (fn) al __attribute__ ((alias (#fn))) attribute_copy (fn);
111
kono
parents: 67
diff changeset
1290
kono
parents: 67
diff changeset
1291 # define ialias_ulp ialias_str1(__USER_LABEL_PREFIX__)
kono
parents: 67
diff changeset
1292 # define ialias_str1(x) ialias_str2(x)
kono
parents: 67
diff changeset
1293 # define ialias_str2(x) #x
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1294 # define ialias(fn) \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1295 extern __typeof (fn) gomp_ialias_##fn \
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1296 __attribute__ ((alias (#fn))) attribute_hidden attribute_copy (fn);
111
kono
parents: 67
diff changeset
1297 # define ialias_redirect(fn) \
kono
parents: 67
diff changeset
1298 extern __typeof (fn) fn __asm__ (ialias_ulp "gomp_ialias_" #fn) attribute_hidden;
kono
parents: 67
diff changeset
1299 # define ialias_call(fn) gomp_ialias_ ## fn
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1300 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1301 # define ialias(fn)
111
kono
parents: 67
diff changeset
1302 # define ialias_redirect(fn)
kono
parents: 67
diff changeset
1303 # define ialias_call(fn) fn
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1304 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1305
111
kono
parents: 67
diff changeset
1306 /* Helper function for priority_node_to_task() and
kono
parents: 67
diff changeset
1307 task_to_priority_node().
kono
parents: 67
diff changeset
1308
kono
parents: 67
diff changeset
1309 Return the offset from a task to its priority_node entry. The
kono
parents: 67
diff changeset
1310 priority_node entry is has a type of TYPE. */
kono
parents: 67
diff changeset
1311
kono
parents: 67
diff changeset
1312 static inline size_t
kono
parents: 67
diff changeset
1313 priority_queue_offset (enum priority_queue_type type)
kono
parents: 67
diff changeset
1314 {
kono
parents: 67
diff changeset
1315 return offsetof (struct gomp_task, pnode[(int) type]);
kono
parents: 67
diff changeset
1316 }
kono
parents: 67
diff changeset
1317
kono
parents: 67
diff changeset
1318 /* Return the task associated with a priority NODE of type TYPE. */
kono
parents: 67
diff changeset
1319
kono
parents: 67
diff changeset
1320 static inline struct gomp_task *
kono
parents: 67
diff changeset
1321 priority_node_to_task (enum priority_queue_type type,
kono
parents: 67
diff changeset
1322 struct priority_node *node)
kono
parents: 67
diff changeset
1323 {
kono
parents: 67
diff changeset
1324 return (struct gomp_task *) ((char *) node - priority_queue_offset (type));
kono
parents: 67
diff changeset
1325 }
kono
parents: 67
diff changeset
1326
kono
parents: 67
diff changeset
1327 /* Return the priority node of type TYPE for a given TASK. */
kono
parents: 67
diff changeset
1328
kono
parents: 67
diff changeset
1329 static inline struct priority_node *
kono
parents: 67
diff changeset
1330 task_to_priority_node (enum priority_queue_type type,
kono
parents: 67
diff changeset
1331 struct gomp_task *task)
kono
parents: 67
diff changeset
1332 {
kono
parents: 67
diff changeset
1333 return (struct priority_node *) ((char *) task
kono
parents: 67
diff changeset
1334 + priority_queue_offset (type));
kono
parents: 67
diff changeset
1335 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1336
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1337 #ifdef LIBGOMP_USE_PTHREADS
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1338 static inline gomp_thread_handle
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1339 gomp_thread_self (void)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1340 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1341 return pthread_self ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1342 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1343
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1344 static inline gomp_thread_handle
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1345 gomp_thread_to_pthread_t (struct gomp_thread *thr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1346 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1347 struct gomp_thread *this_thr = gomp_thread ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1348 if (thr == this_thr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1349 return pthread_self ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1350 #ifdef GOMP_NEEDS_THREAD_HANDLE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1351 return thr->handle;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1352 #else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1353 /* On Linux with initial-exec TLS, the pthread_t of the thread containing
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1354 thr can be computed from thr, this_thr and pthread_self (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1355 as the distance between this_thr and pthread_self () is constant. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1356 return pthread_self () + ((uintptr_t) thr - (uintptr_t) this_thr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1357 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1358 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1359 #else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1360 static inline gomp_thread_handle
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1361 gomp_thread_self (void)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1362 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1363 return (gomp_thread_handle) {};
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1364 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1365
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1366 static inline gomp_thread_handle
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1367 gomp_thread_to_pthread_t (struct gomp_thread *thr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1368 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1369 (void) thr;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1370 return gomp_thread_self ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1371 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1372 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1373
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1374 #endif /* LIBGOMP_H */