2016-07-13 Thomas Preud'homme <thomas.preudhomme@arm.com>
[official-gcc.git] / liboffloadmic / runtime / offload_omp_host.cpp
blob14498470e3abd03ebefe0e0803c1410f36dc9b56
1 /*
2 Copyright (c) 2014-2015 Intel Corporation. All Rights Reserved.
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
6 are met:
8 * Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 * Neither the name of Intel Corporation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include <omp.h>
32 #include "offload.h"
33 #include "compiler_if_host.h"
35 // OpenMP API
37 void omp_set_default_device(int num) __GOMP_NOTHROW
39 if (num >= 0) {
40 __omp_device_num = num;
44 int omp_get_default_device(void) __GOMP_NOTHROW
46 return __omp_device_num;
49 int omp_get_num_devices() __GOMP_NOTHROW
51 __offload_init_library();
52 return mic_engines_total;
55 // OpenMP API wrappers
57 static void omp_set_int_target(
58 TARGET_TYPE target_type,
59 int target_number,
60 int setting,
61 const char* f_name
64 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
65 f_name, 0);
66 if (ofld) {
67 VarDesc vars[1] = {0};
69 vars[0].type.src = c_data;
70 vars[0].type.dst = c_data;
71 vars[0].direction.bits = c_parameter_in;
72 vars[0].size = sizeof(int);
73 vars[0].count = 1;
74 vars[0].ptr = &setting;
76 OFFLOAD_OFFLOAD(ofld, f_name, 0, 1, vars, NULL, 0, 0, 0);
80 static int omp_get_int_target(
81 TARGET_TYPE target_type,
82 int target_number,
83 const char * f_name
86 int setting = 0;
88 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
89 f_name, 0);
90 if (ofld) {
91 VarDesc vars[1] = {0};
93 vars[0].type.src = c_data;
94 vars[0].type.dst = c_data;
95 vars[0].direction.bits = c_parameter_out;
96 vars[0].size = sizeof(int);
97 vars[0].count = 1;
98 vars[0].ptr = &setting;
100 OFFLOAD_OFFLOAD(ofld, f_name, 0, 1, vars, NULL, 0, 0, 0);
102 return setting;
105 void omp_set_num_threads_target(
106 TARGET_TYPE target_type,
107 int target_number,
108 int num_threads
111 omp_set_int_target(target_type, target_number, num_threads,
112 "omp_set_num_threads_target");
115 int omp_get_max_threads_target(
116 TARGET_TYPE target_type,
117 int target_number
120 return omp_get_int_target(target_type, target_number,
121 "omp_get_max_threads_target");
124 int omp_get_num_procs_target(
125 TARGET_TYPE target_type,
126 int target_number
129 return omp_get_int_target(target_type, target_number,
130 "omp_get_num_procs_target");
133 void omp_set_dynamic_target(
134 TARGET_TYPE target_type,
135 int target_number,
136 int num_threads
139 omp_set_int_target(target_type, target_number, num_threads,
140 "omp_set_dynamic_target");
143 int omp_get_dynamic_target(
144 TARGET_TYPE target_type,
145 int target_number
148 return omp_get_int_target(target_type, target_number,
149 "omp_get_dynamic_target");
152 void omp_set_nested_target(
153 TARGET_TYPE target_type,
154 int target_number,
155 int nested
158 omp_set_int_target(target_type, target_number, nested,
159 "omp_set_nested_target");
162 int omp_get_nested_target(
163 TARGET_TYPE target_type,
164 int target_number
167 return omp_get_int_target(target_type, target_number,
168 "omp_get_nested_target");
171 void omp_set_schedule_target(
172 TARGET_TYPE target_type,
173 int target_number,
174 omp_sched_t kind,
175 int modifier
178 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
179 __func__, 0);
180 if (ofld != 0) {
181 VarDesc vars[2] = {0};
183 vars[0].type.src = c_data;
184 vars[0].type.dst = c_data;
185 vars[0].direction.bits = c_parameter_in;
186 vars[0].size = sizeof(omp_sched_t);
187 vars[0].count = 1;
188 vars[0].ptr = &kind;
190 vars[1].type.src = c_data;
191 vars[1].type.dst = c_data;
192 vars[1].direction.bits = c_parameter_in;
193 vars[1].size = sizeof(int);
194 vars[1].count = 1;
195 vars[1].ptr = &modifier;
197 OFFLOAD_OFFLOAD(ofld, "omp_set_schedule_target",
198 0, 2, vars, NULL, 0, 0, 0);
202 void omp_get_schedule_target(
203 TARGET_TYPE target_type,
204 int target_number,
205 omp_sched_t *kind,
206 int *modifier
209 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
210 __func__, 0);
211 if (ofld != 0) {
212 VarDesc vars[2] = {0};
214 vars[0].type.src = c_data;
215 vars[0].type.dst = c_data;
216 vars[0].direction.bits = c_parameter_out;
217 vars[0].size = sizeof(omp_sched_t);
218 vars[0].count = 1;
219 vars[0].ptr = kind;
221 vars[1].type.src = c_data;
222 vars[1].type.dst = c_data;
223 vars[1].direction.bits = c_parameter_out;
224 vars[1].size = sizeof(int);
225 vars[1].count = 1;
226 vars[1].ptr = modifier;
228 OFFLOAD_OFFLOAD(ofld, "omp_get_schedule_target",
229 0, 2, vars, NULL, 0, 0, 0);
233 // lock API functions
235 void omp_init_lock_target(
236 TARGET_TYPE target_type,
237 int target_number,
238 omp_lock_target_t *lock
241 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
242 __func__, 0);
243 if (ofld != 0) {
244 VarDesc vars[1] = {0};
246 vars[0].type.src = c_data;
247 vars[0].type.dst = c_data;
248 vars[0].direction.bits = c_parameter_out;
249 vars[0].size = sizeof(omp_lock_target_t);
250 vars[0].count = 1;
251 vars[0].ptr = lock;
253 OFFLOAD_OFFLOAD(ofld, "omp_init_lock_target",
254 0, 1, vars, NULL, 0, 0, 0);
258 void omp_destroy_lock_target(
259 TARGET_TYPE target_type,
260 int target_number,
261 omp_lock_target_t *lock
264 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
265 __func__, 0);
266 if (ofld != 0) {
267 VarDesc vars[1] = {0};
269 vars[0].type.src = c_data;
270 vars[0].type.dst = c_data;
271 vars[0].direction.bits = c_parameter_in;
272 vars[0].size = sizeof(omp_lock_target_t);
273 vars[0].count = 1;
274 vars[0].ptr = lock;
276 OFFLOAD_OFFLOAD(ofld, "omp_destroy_lock_target",
277 0, 1, vars, NULL, 0, 0, 0);
281 void omp_set_lock_target(
282 TARGET_TYPE target_type,
283 int target_number,
284 omp_lock_target_t *lock
287 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
288 __func__, 0);
289 if (ofld != 0) {
290 VarDesc vars[1] = {0};
292 vars[0].type.src = c_data;
293 vars[0].type.dst = c_data;
294 vars[0].direction.bits = c_parameter_inout;
295 vars[0].size = sizeof(omp_lock_target_t);
296 vars[0].count = 1;
297 vars[0].ptr = lock;
299 OFFLOAD_OFFLOAD(ofld, "omp_set_lock_target",
300 0, 1, vars, NULL, 0, 0, 0);
304 void omp_unset_lock_target(
305 TARGET_TYPE target_type,
306 int target_number,
307 omp_lock_target_t *lock
310 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
311 __func__, 0);
312 if (ofld != 0) {
313 VarDesc vars[1] = {0};
315 vars[0].type.src = c_data;
316 vars[0].type.dst = c_data;
317 vars[0].direction.bits = c_parameter_inout;
318 vars[0].size = sizeof(omp_lock_target_t);
319 vars[0].count = 1;
320 vars[0].ptr = lock;
322 OFFLOAD_OFFLOAD(ofld, "omp_unset_lock_target",
323 0, 1, vars, NULL, 0, 0, 0);
327 int omp_test_lock_target(
328 TARGET_TYPE target_type,
329 int target_number,
330 omp_lock_target_t *lock
333 int result = 0;
335 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
336 __func__, 0);
337 if (ofld != 0) {
338 VarDesc vars[2] = {0};
340 vars[0].type.src = c_data;
341 vars[0].type.dst = c_data;
342 vars[0].direction.bits = c_parameter_inout;
343 vars[0].size = sizeof(omp_lock_target_t);
344 vars[0].count = 1;
345 vars[0].ptr = lock;
347 vars[1].type.src = c_data;
348 vars[1].type.dst = c_data;
349 vars[1].direction.bits = c_parameter_out;
350 vars[1].size = sizeof(int);
351 vars[1].count = 1;
352 vars[1].ptr = &result;
354 OFFLOAD_OFFLOAD(ofld, "omp_test_lock_target",
355 0, 2, vars, NULL, 0, 0, 0);
357 return result;
360 // nested lock API functions
362 void omp_init_nest_lock_target(
363 TARGET_TYPE target_type,
364 int target_number,
365 omp_nest_lock_target_t *lock
368 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
369 __func__, 0);
370 if (ofld != 0) {
371 VarDesc vars[1] = {0};
373 vars[0].type.src = c_data;
374 vars[0].type.dst = c_data;
375 vars[0].direction.bits = c_parameter_out;
376 vars[0].size = sizeof(omp_nest_lock_target_t);
377 vars[0].count = 1;
378 vars[0].ptr = lock;
380 OFFLOAD_OFFLOAD(ofld, "omp_init_nest_lock_target",
381 0, 1, vars, NULL, 0, 0, 0);
385 void omp_destroy_nest_lock_target(
386 TARGET_TYPE target_type,
387 int target_number,
388 omp_nest_lock_target_t *lock
391 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
392 __func__, 0);
393 if (ofld != 0) {
394 VarDesc vars[1] = {0};
396 vars[0].type.src = c_data;
397 vars[0].type.dst = c_data;
398 vars[0].direction.bits = c_parameter_in;
399 vars[0].size = sizeof(omp_nest_lock_target_t);
400 vars[0].count = 1;
401 vars[0].ptr = lock;
403 OFFLOAD_OFFLOAD(ofld, "omp_destroy_nest_lock_target",
404 0, 1, vars, NULL, 0, 0, 0);
408 void omp_set_nest_lock_target(
409 TARGET_TYPE target_type,
410 int target_number,
411 omp_nest_lock_target_t *lock
414 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
415 __func__, 0);
416 if (ofld != 0) {
417 VarDesc vars[1] = {0};
419 vars[0].type.src = c_data;
420 vars[0].type.dst = c_data;
421 vars[0].direction.bits = c_parameter_inout;
422 vars[0].size = sizeof(omp_nest_lock_target_t);
423 vars[0].count = 1;
424 vars[0].ptr = lock;
426 OFFLOAD_OFFLOAD(ofld, "omp_set_nest_lock_target",
427 0, 1, vars, NULL, 0, 0, 0);
431 void omp_unset_nest_lock_target(
432 TARGET_TYPE target_type,
433 int target_number,
434 omp_nest_lock_target_t *lock
437 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
438 __func__, 0);
439 if (ofld != 0) {
440 VarDesc vars[1] = {0};
442 vars[0].type.src = c_data;
443 vars[0].type.dst = c_data;
444 vars[0].direction.bits = c_parameter_inout;
445 vars[0].size = sizeof(omp_nest_lock_target_t);
446 vars[0].count = 1;
447 vars[0].ptr = lock;
449 OFFLOAD_OFFLOAD(ofld, "omp_unset_nest_lock_target",
450 0, 1, vars, NULL, 0, 0, 0);
454 int omp_test_nest_lock_target(
455 TARGET_TYPE target_type,
456 int target_number,
457 omp_nest_lock_target_t *lock
460 int result = 0;
462 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
463 __func__, 0);
464 if (ofld != 0) {
465 VarDesc vars[2] = {0};
467 vars[0].type.src = c_data;
468 vars[0].type.dst = c_data;
469 vars[0].direction.bits = c_parameter_inout;
470 vars[0].size = sizeof(omp_nest_lock_target_t);
471 vars[0].count = 1;
472 vars[0].ptr = lock;
474 vars[1].type.src = c_data;
475 vars[1].type.dst = c_data;
476 vars[1].direction.bits = c_parameter_out;
477 vars[1].size = sizeof(int);
478 vars[1].count = 1;
479 vars[1].ptr = &result;
481 OFFLOAD_OFFLOAD(ofld, "omp_test_nest_lock_target",
482 0, 2, vars, NULL, 0, 0, 0);
484 return result;