annotate liboffloadmic/runtime/compiler_if_host.cpp @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /*
kono
parents:
diff changeset
2 Copyright (c) 2014-2016 Intel Corporation. All Rights Reserved.
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 Redistribution and use in source and binary forms, with or without
kono
parents:
diff changeset
5 modification, are permitted provided that the following conditions
kono
parents:
diff changeset
6 are met:
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 * Redistributions of source code must retain the above copyright
kono
parents:
diff changeset
9 notice, this list of conditions and the following disclaimer.
kono
parents:
diff changeset
10 * Redistributions in binary form must reproduce the above copyright
kono
parents:
diff changeset
11 notice, this list of conditions and the following disclaimer in the
kono
parents:
diff changeset
12 documentation and/or other materials provided with the distribution.
kono
parents:
diff changeset
13 * Neither the name of Intel Corporation nor the names of its
kono
parents:
diff changeset
14 contributors may be used to endorse or promote products derived
kono
parents:
diff changeset
15 from this software without specific prior written permission.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
kono
parents:
diff changeset
18 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
kono
parents:
diff changeset
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
kono
parents:
diff changeset
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
kono
parents:
diff changeset
21 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
kono
parents:
diff changeset
22 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
kono
parents:
diff changeset
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
kono
parents:
diff changeset
24 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
kono
parents:
diff changeset
25 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
kono
parents:
diff changeset
26 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
kono
parents:
diff changeset
27 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
kono
parents:
diff changeset
28 */
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 #include "compiler_if_host.h"
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 #include <malloc.h>
kono
parents:
diff changeset
34 #ifndef TARGET_WINNT
kono
parents:
diff changeset
35 #include <alloca.h>
kono
parents:
diff changeset
36 #endif // TARGET_WINNT
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 // Global counter on host.
kono
parents:
diff changeset
39 // This variable is used if P2OPT_offload_do_data_persistence == 2.
kono
parents:
diff changeset
40 // The variable used to identify offload constructs contained in one procedure.
kono
parents:
diff changeset
41 // Increment of OFFLOAD_CALL_COUNT is inserted at entries of HOST routines with
kono
parents:
diff changeset
42 // offload constructs.
kono
parents:
diff changeset
43 static int offload_call_count = 0;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 extern "C" OFFLOAD OFFLOAD_TARGET_ACQUIRE(
kono
parents:
diff changeset
46 TARGET_TYPE target_type,
kono
parents:
diff changeset
47 int target_number,
kono
parents:
diff changeset
48 int is_optional,
kono
parents:
diff changeset
49 _Offload_status* status,
kono
parents:
diff changeset
50 const char* file,
kono
parents:
diff changeset
51 uint64_t line
kono
parents:
diff changeset
52 )
kono
parents:
diff changeset
53 {
kono
parents:
diff changeset
54 bool retval;
kono
parents:
diff changeset
55 OFFLOAD ofld;
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 // initialize status
kono
parents:
diff changeset
58 if (status != 0) {
kono
parents:
diff changeset
59 status->result = OFFLOAD_UNAVAILABLE;
kono
parents:
diff changeset
60 status->device_number = -1;
kono
parents:
diff changeset
61 status->data_sent = 0;
kono
parents:
diff changeset
62 status->data_received = 0;
kono
parents:
diff changeset
63 }
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 // make sure libray is initialized
kono
parents:
diff changeset
66 retval = __offload_init_library();
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 // OFFLOAD_TIMER_INIT must follow call to __offload_init_library
kono
parents:
diff changeset
69 OffloadHostTimerData * timer_data = OFFLOAD_TIMER_INIT(file, line);
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 OFFLOAD_TIMER_START(timer_data, c_offload_host_total_offload);
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 OFFLOAD_TIMER_START(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 // initialize all devices is init_type is on_offload_all
kono
parents:
diff changeset
76 if (retval && __offload_init_type == c_init_on_offload_all) {
kono
parents:
diff changeset
77 for (int i = 0; i < mic_engines_total; i++) {
kono
parents:
diff changeset
78 mic_engines[i].init();
kono
parents:
diff changeset
79 }
kono
parents:
diff changeset
80 }
kono
parents:
diff changeset
81 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 OFFLOAD_TIMER_START(timer_data, c_offload_host_target_acquire);
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 if (target_type == TARGET_HOST) {
kono
parents:
diff changeset
86 // Host always available
kono
parents:
diff changeset
87 retval = true;
kono
parents:
diff changeset
88 }
kono
parents:
diff changeset
89 else if (target_type == TARGET_MIC) {
kono
parents:
diff changeset
90 if (target_number >= -1) {
kono
parents:
diff changeset
91 if (retval) {
kono
parents:
diff changeset
92 if (target_number >= 0) {
kono
parents:
diff changeset
93 // User provided the device number
kono
parents:
diff changeset
94 target_number = target_number % mic_engines_total;
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96 else {
kono
parents:
diff changeset
97 // use device 0
kono
parents:
diff changeset
98 target_number = 0;
kono
parents:
diff changeset
99 }
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 // reserve device in ORSL
kono
parents:
diff changeset
102 if (is_optional) {
kono
parents:
diff changeset
103 if (!ORSL::try_reserve(target_number)) {
kono
parents:
diff changeset
104 target_number = -1;
kono
parents:
diff changeset
105 }
kono
parents:
diff changeset
106 }
kono
parents:
diff changeset
107 else {
kono
parents:
diff changeset
108 if (!ORSL::reserve(target_number)) {
kono
parents:
diff changeset
109 target_number = -1;
kono
parents:
diff changeset
110 }
kono
parents:
diff changeset
111 }
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 // initialize device
kono
parents:
diff changeset
114 if (target_number >= 0 &&
kono
parents:
diff changeset
115 __offload_init_type == c_init_on_offload) {
kono
parents:
diff changeset
116 OFFLOAD_TIMER_START(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
117 mic_engines[target_number].init();
kono
parents:
diff changeset
118 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
119 }
kono
parents:
diff changeset
120 }
kono
parents:
diff changeset
121 else {
kono
parents:
diff changeset
122 // fallback to CPU
kono
parents:
diff changeset
123 target_number = -1;
kono
parents:
diff changeset
124 }
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 if (target_number < 0 || !retval) {
kono
parents:
diff changeset
127 if (!is_optional && status == 0) {
kono
parents:
diff changeset
128 LIBOFFLOAD_ERROR(c_device_is_not_available);
kono
parents:
diff changeset
129 exit(1);
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 retval = false;
kono
parents:
diff changeset
133 }
kono
parents:
diff changeset
134 }
kono
parents:
diff changeset
135 else {
kono
parents:
diff changeset
136 LIBOFFLOAD_ERROR(c_invalid_device_number);
kono
parents:
diff changeset
137 exit(1);
kono
parents:
diff changeset
138 }
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 if (retval) {
kono
parents:
diff changeset
142 ofld = new OffloadDescriptor(target_number, status,
kono
parents:
diff changeset
143 !is_optional, false, timer_data);
kono
parents:
diff changeset
144 OFFLOAD_TIMER_HOST_MIC_NUM(timer_data, target_number);
kono
parents:
diff changeset
145 Offload_Report_Prolog(timer_data);
kono
parents:
diff changeset
146 OFFLOAD_DEBUG_TRACE_1(2, timer_data->offload_number, c_offload_start,
kono
parents:
diff changeset
147 "Starting offload: target_type = %d, "
kono
parents:
diff changeset
148 "number = %d, is_optional = %d\n",
kono
parents:
diff changeset
149 target_type, target_number, is_optional);
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_target_acquire);
kono
parents:
diff changeset
152 }
kono
parents:
diff changeset
153 else {
kono
parents:
diff changeset
154 ofld = NULL;
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_target_acquire);
kono
parents:
diff changeset
157 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_total_offload);
kono
parents:
diff changeset
158 offload_report_free_data(timer_data);
kono
parents:
diff changeset
159 }
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 return ofld;
kono
parents:
diff changeset
162 }
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 // This routine is called for OpenMP4.5 offload calls
kono
parents:
diff changeset
165 // OpenMP 4.5 offload is always optional.
kono
parents:
diff changeset
166 extern "C" OFFLOAD OFFLOAD_TARGET_ACQUIRE1(
kono
parents:
diff changeset
167 const int* device_num,
kono
parents:
diff changeset
168 const char* file,
kono
parents:
diff changeset
169 uint64_t line
kono
parents:
diff changeset
170 )
kono
parents:
diff changeset
171 {
kono
parents:
diff changeset
172 int target_number;
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 // make sure libray is initialized and at least one device is available
kono
parents:
diff changeset
175 if (!__offload_init_library()) {
kono
parents:
diff changeset
176 OFFLOAD_DEBUG_TRACE(2, "No device available, fall back to host\n");
kono
parents:
diff changeset
177 return NULL;
kono
parents:
diff changeset
178 }
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 // OFFLOAD_TIMER_INIT must follow call to __offload_init_library
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 OffloadHostTimerData * timer_data = OFFLOAD_TIMER_INIT(file, line);
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 OFFLOAD_TIMER_START(timer_data, c_offload_host_total_offload);
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 OFFLOAD_TIMER_START(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 if (__offload_init_type == c_init_on_offload_all) {
kono
parents:
diff changeset
189 for (int i = 0; i < mic_engines_total; i++) {
kono
parents:
diff changeset
190 mic_engines[i].init();
kono
parents:
diff changeset
191 }
kono
parents:
diff changeset
192 }
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 OFFLOAD_TIMER_START(timer_data, c_offload_host_target_acquire);
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 // use default device number if it is not provided
kono
parents:
diff changeset
199 if (device_num != 0) {
kono
parents:
diff changeset
200 target_number = *device_num;
kono
parents:
diff changeset
201 }
kono
parents:
diff changeset
202 else {
kono
parents:
diff changeset
203 target_number = __omp_device_num;
kono
parents:
diff changeset
204 }
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 // device number should be a non-negative integer value
kono
parents:
diff changeset
207 if (target_number < 0) {
kono
parents:
diff changeset
208 LIBOFFLOAD_ERROR(c_omp_invalid_device_num);
kono
parents:
diff changeset
209 exit(1);
kono
parents:
diff changeset
210 }
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 // should we do this for OpenMP?
kono
parents:
diff changeset
213 target_number %= mic_engines_total;
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 // reserve device in ORSL
kono
parents:
diff changeset
216 if (!ORSL::reserve(target_number)) {
kono
parents:
diff changeset
217 LIBOFFLOAD_ERROR(c_device_is_not_available);
kono
parents:
diff changeset
218 exit(1);
kono
parents:
diff changeset
219 }
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 // initialize device(s)
kono
parents:
diff changeset
222 OFFLOAD_TIMER_START(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 if (__offload_init_type == c_init_on_offload) {
kono
parents:
diff changeset
225 mic_engines[target_number].init();
kono
parents:
diff changeset
226 }
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 OFFLOAD ofld =
kono
parents:
diff changeset
231 new OffloadDescriptor(target_number, 0, true, true, timer_data);
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 OFFLOAD_TIMER_HOST_MIC_NUM(timer_data, target_number);
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 Offload_Report_Prolog(timer_data);
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 OFFLOAD_DEBUG_TRACE_1(2, timer_data->offload_number, c_offload_start,
kono
parents:
diff changeset
238 "Starting OpenMP offload, device = %d\n",
kono
parents:
diff changeset
239 target_number);
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_target_acquire);
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 return ofld;
kono
parents:
diff changeset
244 }
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 extern "C" OFFLOAD OFFLOAD_TARGET_ACQUIRE2(
kono
parents:
diff changeset
247 TARGET_TYPE target_type,
kono
parents:
diff changeset
248 int target_number,
kono
parents:
diff changeset
249 int is_optional,
kono
parents:
diff changeset
250 _Offload_status* status,
kono
parents:
diff changeset
251 const char* file,
kono
parents:
diff changeset
252 uint64_t line,
kono
parents:
diff changeset
253 const void** stream
kono
parents:
diff changeset
254 )
kono
parents:
diff changeset
255 {
kono
parents:
diff changeset
256 bool retval;
kono
parents:
diff changeset
257 OFFLOAD ofld;
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 // initialize status
kono
parents:
diff changeset
260 if (status != 0) {
kono
parents:
diff changeset
261 status->result = OFFLOAD_UNAVAILABLE;
kono
parents:
diff changeset
262 status->device_number = -1;
kono
parents:
diff changeset
263 status->data_sent = 0;
kono
parents:
diff changeset
264 status->data_received = 0;
kono
parents:
diff changeset
265 }
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 // make sure libray is initialized
kono
parents:
diff changeset
268 retval = __offload_init_library();
kono
parents:
diff changeset
269 // OFFLOAD_TIMER_INIT must follow call to __offload_init_library
kono
parents:
diff changeset
270 OffloadHostTimerData * timer_data = OFFLOAD_TIMER_INIT(file, line);
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 OFFLOAD_TIMER_START(timer_data, c_offload_host_total_offload);
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 OFFLOAD_TIMER_START(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 // initalize all devices if init_type is on_offload_all
kono
parents:
diff changeset
277 if (retval && __offload_init_type == c_init_on_offload_all) {
kono
parents:
diff changeset
278 for (int i = 0; i < mic_engines_total; i++) {
kono
parents:
diff changeset
279 mic_engines[i].init();
kono
parents:
diff changeset
280 }
kono
parents:
diff changeset
281 }
kono
parents:
diff changeset
282 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 OFFLOAD_TIMER_START(timer_data, c_offload_host_target_acquire);
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 if (target_type == TARGET_HOST) {
kono
parents:
diff changeset
287 // Host always available
kono
parents:
diff changeset
288 retval = true;
kono
parents:
diff changeset
289 }
kono
parents:
diff changeset
290 else if (target_type == TARGET_MIC) {
kono
parents:
diff changeset
291 _Offload_stream handle = *(reinterpret_cast<_Offload_stream*>(stream));
kono
parents:
diff changeset
292 Stream * stream = handle ? Stream::find_stream(handle, false) : NULL;
kono
parents:
diff changeset
293 if (target_number >= -1) {
kono
parents:
diff changeset
294 if (retval) {
kono
parents:
diff changeset
295 // device number is defined by stream
kono
parents:
diff changeset
296 if (stream) {
kono
parents:
diff changeset
297 target_number = stream->get_device();
kono
parents:
diff changeset
298 target_number = target_number % mic_engines_total;
kono
parents:
diff changeset
299 }
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 // reserve device in ORSL
kono
parents:
diff changeset
302 if (target_number != -1) {
kono
parents:
diff changeset
303 if (is_optional) {
kono
parents:
diff changeset
304 if (!ORSL::try_reserve(target_number)) {
kono
parents:
diff changeset
305 target_number = -1;
kono
parents:
diff changeset
306 }
kono
parents:
diff changeset
307 }
kono
parents:
diff changeset
308 else {
kono
parents:
diff changeset
309 if (!ORSL::reserve(target_number)) {
kono
parents:
diff changeset
310 target_number = -1;
kono
parents:
diff changeset
311 }
kono
parents:
diff changeset
312 }
kono
parents:
diff changeset
313 }
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 // initialize device
kono
parents:
diff changeset
316 if (target_number >= 0 &&
kono
parents:
diff changeset
317 __offload_init_type == c_init_on_offload) {
kono
parents:
diff changeset
318 OFFLOAD_TIMER_START(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
319 mic_engines[target_number].init();
kono
parents:
diff changeset
320 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_initialize);
kono
parents:
diff changeset
321 }
kono
parents:
diff changeset
322 }
kono
parents:
diff changeset
323 else {
kono
parents:
diff changeset
324 // fallback to CPU
kono
parents:
diff changeset
325 target_number = -1;
kono
parents:
diff changeset
326 }
kono
parents:
diff changeset
327 if (!(target_number == -1 && handle == 0)) {
kono
parents:
diff changeset
328 if (target_number < 0 || !retval) {
kono
parents:
diff changeset
329 if (!is_optional && status == 0) {
kono
parents:
diff changeset
330 LIBOFFLOAD_ERROR(c_device_is_not_available);
kono
parents:
diff changeset
331 exit(1);
kono
parents:
diff changeset
332 }
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 retval = false;
kono
parents:
diff changeset
335 }
kono
parents:
diff changeset
336 }
kono
parents:
diff changeset
337 }
kono
parents:
diff changeset
338 else {
kono
parents:
diff changeset
339 LIBOFFLOAD_ERROR(c_invalid_device_number);
kono
parents:
diff changeset
340 exit(1);
kono
parents:
diff changeset
341 }
kono
parents:
diff changeset
342 }
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 if (retval) {
kono
parents:
diff changeset
345 ofld = new OffloadDescriptor(target_number, status,
kono
parents:
diff changeset
346 !is_optional, false, timer_data);
kono
parents:
diff changeset
347 OFFLOAD_TIMER_HOST_MIC_NUM(timer_data, target_number);
kono
parents:
diff changeset
348 Offload_Report_Prolog(timer_data);
kono
parents:
diff changeset
349 OFFLOAD_DEBUG_TRACE_1(2, timer_data->offload_number, c_offload_start,
kono
parents:
diff changeset
350 "Starting offload: target_type = %d, "
kono
parents:
diff changeset
351 "number = %d, is_optional = %d\n",
kono
parents:
diff changeset
352 target_type, target_number, is_optional);
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_target_acquire);
kono
parents:
diff changeset
355 }
kono
parents:
diff changeset
356 else {
kono
parents:
diff changeset
357 ofld = NULL;
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_target_acquire);
kono
parents:
diff changeset
360 OFFLOAD_TIMER_STOP(timer_data, c_offload_host_total_offload);
kono
parents:
diff changeset
361 offload_report_free_data(timer_data);
kono
parents:
diff changeset
362 }
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 return ofld;
kono
parents:
diff changeset
365 }
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 static int offload_offload_wrap(
kono
parents:
diff changeset
368 OFFLOAD ofld,
kono
parents:
diff changeset
369 const char *name,
kono
parents:
diff changeset
370 int is_empty,
kono
parents:
diff changeset
371 int num_vars,
kono
parents:
diff changeset
372 VarDesc *vars,
kono
parents:
diff changeset
373 VarDesc2 *vars2,
kono
parents:
diff changeset
374 int num_waits,
kono
parents:
diff changeset
375 const void **waits,
kono
parents:
diff changeset
376 const void **signal,
kono
parents:
diff changeset
377 int entry_id,
kono
parents:
diff changeset
378 const void *stack_addr,
kono
parents:
diff changeset
379 OffloadFlags offload_flags
kono
parents:
diff changeset
380 )
kono
parents:
diff changeset
381 {
kono
parents:
diff changeset
382 if (signal) {
kono
parents:
diff changeset
383 ofld->set_signal(*signal);
kono
parents:
diff changeset
384 }
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 bool ret = ofld->offload(name, is_empty, vars, vars2, num_vars,
kono
parents:
diff changeset
387 waits, num_waits, signal, entry_id,
kono
parents:
diff changeset
388 stack_addr, offload_flags);
kono
parents:
diff changeset
389 if (!ret || (signal == 0 && ofld->get_stream() == 0 &&
kono
parents:
diff changeset
390 !offload_flags.bits.omp_async)) {
kono
parents:
diff changeset
391 delete ofld;
kono
parents:
diff changeset
392 }
kono
parents:
diff changeset
393 return ret;
kono
parents:
diff changeset
394 }
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 extern "C" int OFFLOAD_OFFLOAD1(
kono
parents:
diff changeset
397 OFFLOAD ofld,
kono
parents:
diff changeset
398 const char *name,
kono
parents:
diff changeset
399 int is_empty,
kono
parents:
diff changeset
400 int num_vars,
kono
parents:
diff changeset
401 VarDesc *vars,
kono
parents:
diff changeset
402 VarDesc2 *vars2,
kono
parents:
diff changeset
403 int num_waits,
kono
parents:
diff changeset
404 const void **waits,
kono
parents:
diff changeset
405 const void **signal
kono
parents:
diff changeset
406 )
kono
parents:
diff changeset
407 {
kono
parents:
diff changeset
408 return offload_offload_wrap(ofld, name, is_empty,
kono
parents:
diff changeset
409 num_vars, vars, vars2,
kono
parents:
diff changeset
410 num_waits, waits,
kono
parents:
diff changeset
411 signal, 0, NULL, {0});
kono
parents:
diff changeset
412 }
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 extern "C" int OFFLOAD_OFFLOAD2(
kono
parents:
diff changeset
415 OFFLOAD ofld,
kono
parents:
diff changeset
416 const char *name,
kono
parents:
diff changeset
417 int is_empty,
kono
parents:
diff changeset
418 int num_vars,
kono
parents:
diff changeset
419 VarDesc *vars,
kono
parents:
diff changeset
420 VarDesc2 *vars2,
kono
parents:
diff changeset
421 int num_waits,
kono
parents:
diff changeset
422 const void** waits,
kono
parents:
diff changeset
423 const void** signal,
kono
parents:
diff changeset
424 int entry_id,
kono
parents:
diff changeset
425 const void *stack_addr
kono
parents:
diff changeset
426 )
kono
parents:
diff changeset
427 {
kono
parents:
diff changeset
428 return offload_offload_wrap(ofld, name, is_empty,
kono
parents:
diff changeset
429 num_vars, vars, vars2,
kono
parents:
diff changeset
430 num_waits, waits,
kono
parents:
diff changeset
431 signal, entry_id, stack_addr, {0});
kono
parents:
diff changeset
432 }
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 extern "C" int OFFLOAD_OFFLOAD3(
kono
parents:
diff changeset
435 OFFLOAD ofld,
kono
parents:
diff changeset
436 const char *name,
kono
parents:
diff changeset
437 int is_empty,
kono
parents:
diff changeset
438 int num_vars,
kono
parents:
diff changeset
439 VarDesc *vars,
kono
parents:
diff changeset
440 VarDesc2 *vars2,
kono
parents:
diff changeset
441 int num_waits,
kono
parents:
diff changeset
442 const void** waits,
kono
parents:
diff changeset
443 const void** signal,
kono
parents:
diff changeset
444 int entry_id,
kono
parents:
diff changeset
445 const void *stack_addr,
kono
parents:
diff changeset
446 OffloadFlags offload_flags,
kono
parents:
diff changeset
447 const void** stream
kono
parents:
diff changeset
448 )
kono
parents:
diff changeset
449 {
kono
parents:
diff changeset
450 // 1. if the source is compiled with -traceback then stream is 0
kono
parents:
diff changeset
451 // 2. if offload has a stream clause then stream is address of stream value
kono
parents:
diff changeset
452 if (stream) {
kono
parents:
diff changeset
453 ofld->set_stream(*(reinterpret_cast<_Offload_stream *>(stream)));
kono
parents:
diff changeset
454 }
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 return offload_offload_wrap(ofld, name, is_empty,
kono
parents:
diff changeset
457 num_vars, vars, vars2,
kono
parents:
diff changeset
458 num_waits, waits,
kono
parents:
diff changeset
459 signal, entry_id, stack_addr, offload_flags);
kono
parents:
diff changeset
460 }
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 extern "C" int OFFLOAD_OFFLOAD(
kono
parents:
diff changeset
463 OFFLOAD ofld,
kono
parents:
diff changeset
464 const char *name,
kono
parents:
diff changeset
465 int is_empty,
kono
parents:
diff changeset
466 int num_vars,
kono
parents:
diff changeset
467 VarDesc *vars,
kono
parents:
diff changeset
468 VarDesc2 *vars2,
kono
parents:
diff changeset
469 int num_waits,
kono
parents:
diff changeset
470 const void **waits,
kono
parents:
diff changeset
471 const void *signal,
kono
parents:
diff changeset
472 int entry_id,
kono
parents:
diff changeset
473 const void *stack_addr
kono
parents:
diff changeset
474 )
kono
parents:
diff changeset
475 {
kono
parents:
diff changeset
476 // signal is passed by reference now
kono
parents:
diff changeset
477 const void **signal_new = (signal != 0) ? &signal : 0;
kono
parents:
diff changeset
478 const void **waits_new = 0;
kono
parents:
diff changeset
479 int num_waits_new = 0;
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 // remove NULL values from the list of signals to wait for
kono
parents:
diff changeset
482 if (num_waits > 0) {
kono
parents:
diff changeset
483 waits_new = (const void**) alloca(sizeof(void*) * num_waits);
kono
parents:
diff changeset
484 for (int i = 0; i < num_waits; i++) {
kono
parents:
diff changeset
485 if (waits[i] != 0) {
kono
parents:
diff changeset
486 waits_new[num_waits_new++] = waits[i];
kono
parents:
diff changeset
487 }
kono
parents:
diff changeset
488 }
kono
parents:
diff changeset
489 }
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 return OFFLOAD_OFFLOAD1(ofld, name, is_empty,
kono
parents:
diff changeset
492 num_vars, vars, vars2,
kono
parents:
diff changeset
493 num_waits_new, waits_new,
kono
parents:
diff changeset
494 signal_new);
kono
parents:
diff changeset
495 }
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 extern "C" int OFFLOAD_CALL_COUNT()
kono
parents:
diff changeset
498 {
kono
parents:
diff changeset
499 offload_call_count++;
kono
parents:
diff changeset
500 return offload_call_count;
kono
parents:
diff changeset
501 }