annotate liboffloadmic/runtime/offload_omp_target.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 <omp.h>
kono
parents:
diff changeset
32 #include "offload.h"
kono
parents:
diff changeset
33 #include "compiler_if_target.h"
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 // OpenMP API
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 void omp_set_default_device(int num) __GOMP_NOTHROW
kono
parents:
diff changeset
38 {
kono
parents:
diff changeset
39 }
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 int omp_get_default_device(void) __GOMP_NOTHROW
kono
parents:
diff changeset
42 {
kono
parents:
diff changeset
43 return mic_index;
kono
parents:
diff changeset
44 }
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 int omp_get_num_devices() __GOMP_NOTHROW
kono
parents:
diff changeset
47 {
kono
parents:
diff changeset
48 return mic_engines_total;
kono
parents:
diff changeset
49 }
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 // OpenMP 4.5 APIs
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 // COI supports 3-dim multiD transfers
kono
parents:
diff changeset
54 #define MAX_ARRAY_RANK 3
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 DLL_LOCAL void omp_target_alloc_target(
kono
parents:
diff changeset
57 void *ofld_
kono
parents:
diff changeset
58 )
kono
parents:
diff changeset
59 {
kono
parents:
diff changeset
60 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
61 VarDesc vars[2] = {0};
kono
parents:
diff changeset
62 size_t size;
kono
parents:
diff changeset
63 void* memory;
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 vars[0].type.src = c_data;
kono
parents:
diff changeset
66 vars[0].type.dst = c_data;
kono
parents:
diff changeset
67 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
68 vars[0].ptr = &size;
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 vars[1].type.src = c_data;
kono
parents:
diff changeset
71 vars[1].type.dst = c_data;
kono
parents:
diff changeset
72 vars[1].direction.bits = c_parameter_out;
kono
parents:
diff changeset
73 vars[1].ptr = &memory;
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
kono
parents:
diff changeset
76 OFFLOAD_DEBUG_TRACE(2, "omp_target_alloc(%lld)\n", size);
kono
parents:
diff changeset
77 // We do not check for malloc returning NULL because the
kono
parents:
diff changeset
78 // specification of this API includes the possibility of failure.
kono
parents:
diff changeset
79 // The user will check the returned result
kono
parents:
diff changeset
80 memory = malloc(size);
kono
parents:
diff changeset
81 OFFLOAD_DEBUG_TRACE(2, "omp_target_alloc allocated at %p\n", memory);
kono
parents:
diff changeset
82 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
83 }
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 DLL_LOCAL void omp_target_free_target(
kono
parents:
diff changeset
86 void *ofld_
kono
parents:
diff changeset
87 )
kono
parents:
diff changeset
88 {
kono
parents:
diff changeset
89 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
90 VarDesc vars[1] = {0};
kono
parents:
diff changeset
91 void* memory;
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 vars[0].type.src = c_data;
kono
parents:
diff changeset
94 vars[0].type.dst = c_data;
kono
parents:
diff changeset
95 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
96 vars[0].ptr = &memory;
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
99 OFFLOAD_DEBUG_TRACE(2, "omp_target_free(%p)\n", memory);
kono
parents:
diff changeset
100 free(memory);
kono
parents:
diff changeset
101 OFFLOAD_DEBUG_TRACE(2, "omp_target_free freed\n");
kono
parents:
diff changeset
102 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
103 }
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 DLL_LOCAL void omp_target_memcpy_target(
kono
parents:
diff changeset
106 void *ofld_
kono
parents:
diff changeset
107 )
kono
parents:
diff changeset
108 {
kono
parents:
diff changeset
109 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
110 VarDesc vars[3] = {0};
kono
parents:
diff changeset
111 void* dst;
kono
parents:
diff changeset
112 void* src;
kono
parents:
diff changeset
113 size_t length;
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 vars[0].type.src = c_data;
kono
parents:
diff changeset
116 vars[0].type.dst = c_data;
kono
parents:
diff changeset
117 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
118 vars[0].ptr = &dst;
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 vars[1].type.src = c_data;
kono
parents:
diff changeset
121 vars[1].type.dst = c_data;
kono
parents:
diff changeset
122 vars[1].direction.bits = c_parameter_in;
kono
parents:
diff changeset
123 vars[1].ptr = &src;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 vars[2].type.src = c_data;
kono
parents:
diff changeset
126 vars[2].type.dst = c_data;
kono
parents:
diff changeset
127 vars[2].direction.bits = c_parameter_in;
kono
parents:
diff changeset
128 vars[2].ptr = &length;
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 OFFLOAD_TARGET_ENTER(ofld, 3, vars, NULL);
kono
parents:
diff changeset
131 OFFLOAD_DEBUG_TRACE(2, "omp_target_memcpy(%p, %p, %lld)\n",
kono
parents:
diff changeset
132 dst, src, length);
kono
parents:
diff changeset
133 memcpy(dst, src, length);
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 OFFLOAD_DEBUG_TRACE(2, "omp_target_memcpy done\n");
kono
parents:
diff changeset
136 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
137 }
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 static size_t bytesize_at_this_dimension(
kono
parents:
diff changeset
140 size_t element_size,
kono
parents:
diff changeset
141 int num_dims,
kono
parents:
diff changeset
142 const size_t* dimensions
kono
parents:
diff changeset
143 )
kono
parents:
diff changeset
144 {
kono
parents:
diff changeset
145 if (num_dims > 1) {
kono
parents:
diff changeset
146 return dimensions[1] *
kono
parents:
diff changeset
147 bytesize_at_this_dimension(
kono
parents:
diff changeset
148 element_size, num_dims-1, dimensions+1);
kono
parents:
diff changeset
149 } else {
kono
parents:
diff changeset
150 return element_size;
kono
parents:
diff changeset
151 }
kono
parents:
diff changeset
152 }
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 static void memcpy_rect(
kono
parents:
diff changeset
155 char *dst,
kono
parents:
diff changeset
156 char *src,
kono
parents:
diff changeset
157 size_t element_size,
kono
parents:
diff changeset
158 int num_dims,
kono
parents:
diff changeset
159 const size_t *volume,
kono
parents:
diff changeset
160 const size_t *dst_offsets,
kono
parents:
diff changeset
161 const size_t *src_offsets,
kono
parents:
diff changeset
162 const size_t *dst_dimensions,
kono
parents:
diff changeset
163 const size_t *src_dimensions
kono
parents:
diff changeset
164 )
kono
parents:
diff changeset
165 {
kono
parents:
diff changeset
166 if (num_dims > 1) {
kono
parents:
diff changeset
167 int count = volume[0];
kono
parents:
diff changeset
168 int dst_index = dst_offsets[0];
kono
parents:
diff changeset
169 int src_index = src_offsets[0];
kono
parents:
diff changeset
170 size_t dst_element_size =
kono
parents:
diff changeset
171 bytesize_at_this_dimension(element_size, num_dims, dst_dimensions);
kono
parents:
diff changeset
172 size_t src_element_size =
kono
parents:
diff changeset
173 bytesize_at_this_dimension(element_size, num_dims, src_dimensions);
kono
parents:
diff changeset
174 for (; count>0; dst_index++, src_index++, count--) {
kono
parents:
diff changeset
175 memcpy_rect(dst+dst_element_size*dst_index,
kono
parents:
diff changeset
176 src+src_element_size*src_index,
kono
parents:
diff changeset
177 element_size, num_dims-1, volume+1,
kono
parents:
diff changeset
178 dst_offsets+1, src_offsets+1,
kono
parents:
diff changeset
179 dst_dimensions+1, src_dimensions+1);
kono
parents:
diff changeset
180 }
kono
parents:
diff changeset
181 } else {
kono
parents:
diff changeset
182 memcpy(dst+dst_offsets[0]*element_size,
kono
parents:
diff changeset
183 src+src_offsets[0]*element_size,
kono
parents:
diff changeset
184 element_size * volume[0]);
kono
parents:
diff changeset
185 }
kono
parents:
diff changeset
186 }
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 DLL_LOCAL void omp_target_memcpy_rect_target(
kono
parents:
diff changeset
189 void *ofld_
kono
parents:
diff changeset
190 )
kono
parents:
diff changeset
191 {
kono
parents:
diff changeset
192 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
193 VarDesc vars[1] = {0};
kono
parents:
diff changeset
194 struct parameters {
kono
parents:
diff changeset
195 void *dst;
kono
parents:
diff changeset
196 void *src;
kono
parents:
diff changeset
197 size_t element_size;
kono
parents:
diff changeset
198 int num_dims;
kono
parents:
diff changeset
199 size_t array_info[MAX_ARRAY_RANK*5];
kono
parents:
diff changeset
200 } parameters;
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 vars[0].type.src = c_data;
kono
parents:
diff changeset
203 vars[0].type.dst = c_data;
kono
parents:
diff changeset
204 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
205 vars[0].ptr = &parameters;
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
208 OFFLOAD_DEBUG_TRACE(2, "omp_target_memcpy_rect(%p, %p, %lld, %d)\n",
kono
parents:
diff changeset
209 parameters.dst, parameters.src,
kono
parents:
diff changeset
210 parameters.element_size, parameters.num_dims);
kono
parents:
diff changeset
211 memcpy_rect(
kono
parents:
diff changeset
212 (char*)parameters.dst, (char*)parameters.src, parameters.element_size,
kono
parents:
diff changeset
213 parameters.num_dims,
kono
parents:
diff changeset
214 &parameters.array_info[0],
kono
parents:
diff changeset
215 &parameters.array_info[parameters.num_dims],
kono
parents:
diff changeset
216 &parameters.array_info[parameters.num_dims*2],
kono
parents:
diff changeset
217 &parameters.array_info[parameters.num_dims*3],
kono
parents:
diff changeset
218 &parameters.array_info[parameters.num_dims*4]);
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 OFFLOAD_DEBUG_TRACE(2, "omp_target_memcpy_rect done\n");
kono
parents:
diff changeset
221 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
222 }
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 // End of OpenMP 4.5 APIs
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 // OpenMP API wrappers
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 static void omp_send_int_to_host(
kono
parents:
diff changeset
230 void *ofld_,
kono
parents:
diff changeset
231 int setting
kono
parents:
diff changeset
232 )
kono
parents:
diff changeset
233 {
kono
parents:
diff changeset
234 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
235 VarDesc vars[1] = {0};
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 vars[0].type.src = c_data;
kono
parents:
diff changeset
238 vars[0].type.dst = c_data;
kono
parents:
diff changeset
239 vars[0].direction.bits = c_parameter_out;
kono
parents:
diff changeset
240 vars[0].ptr = &setting;
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
243 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
244 }
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 static int omp_get_int_from_host(
kono
parents:
diff changeset
247 void *ofld_
kono
parents:
diff changeset
248 )
kono
parents:
diff changeset
249 {
kono
parents:
diff changeset
250 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
251 VarDesc vars[1] = {0};
kono
parents:
diff changeset
252 int setting;
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 vars[0].type.src = c_data;
kono
parents:
diff changeset
255 vars[0].type.dst = c_data;
kono
parents:
diff changeset
256 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
257 vars[0].ptr = &setting;
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
260 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 return setting;
kono
parents:
diff changeset
263 }
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 DLL_LOCAL void omp_set_num_threads_lrb(
kono
parents:
diff changeset
266 void *ofld
kono
parents:
diff changeset
267 )
kono
parents:
diff changeset
268 {
kono
parents:
diff changeset
269 int num_threads;
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 num_threads = omp_get_int_from_host(ofld);
kono
parents:
diff changeset
272 omp_set_num_threads(num_threads);
kono
parents:
diff changeset
273 }
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 DLL_LOCAL void omp_get_max_threads_lrb(
kono
parents:
diff changeset
276 void *ofld
kono
parents:
diff changeset
277 )
kono
parents:
diff changeset
278 {
kono
parents:
diff changeset
279 int num_threads;
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 num_threads = omp_get_max_threads();
kono
parents:
diff changeset
282 omp_send_int_to_host(ofld, num_threads);
kono
parents:
diff changeset
283 }
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 DLL_LOCAL void omp_get_num_procs_lrb(
kono
parents:
diff changeset
286 void *ofld
kono
parents:
diff changeset
287 )
kono
parents:
diff changeset
288 {
kono
parents:
diff changeset
289 int num_procs;
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 num_procs = omp_get_num_procs();
kono
parents:
diff changeset
292 omp_send_int_to_host(ofld, num_procs);
kono
parents:
diff changeset
293 }
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 DLL_LOCAL void omp_set_dynamic_lrb(
kono
parents:
diff changeset
296 void *ofld
kono
parents:
diff changeset
297 )
kono
parents:
diff changeset
298 {
kono
parents:
diff changeset
299 int dynamic;
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 dynamic = omp_get_int_from_host(ofld);
kono
parents:
diff changeset
302 omp_set_dynamic(dynamic);
kono
parents:
diff changeset
303 }
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 DLL_LOCAL void omp_get_dynamic_lrb(
kono
parents:
diff changeset
306 void *ofld
kono
parents:
diff changeset
307 )
kono
parents:
diff changeset
308 {
kono
parents:
diff changeset
309 int dynamic;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 dynamic = omp_get_dynamic();
kono
parents:
diff changeset
312 omp_send_int_to_host(ofld, dynamic);
kono
parents:
diff changeset
313 }
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 DLL_LOCAL void omp_set_nested_lrb(
kono
parents:
diff changeset
316 void *ofld
kono
parents:
diff changeset
317 )
kono
parents:
diff changeset
318 {
kono
parents:
diff changeset
319 int nested;
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 nested = omp_get_int_from_host(ofld);
kono
parents:
diff changeset
322 omp_set_nested(nested);
kono
parents:
diff changeset
323 }
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 DLL_LOCAL void omp_get_nested_lrb(
kono
parents:
diff changeset
326 void *ofld
kono
parents:
diff changeset
327 )
kono
parents:
diff changeset
328 {
kono
parents:
diff changeset
329 int nested;
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 nested = omp_get_nested();
kono
parents:
diff changeset
332 omp_send_int_to_host(ofld, nested);
kono
parents:
diff changeset
333 }
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 DLL_LOCAL void omp_set_schedule_lrb(
kono
parents:
diff changeset
336 void *ofld_
kono
parents:
diff changeset
337 )
kono
parents:
diff changeset
338 {
kono
parents:
diff changeset
339 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
340 VarDesc vars[2] = {0};
kono
parents:
diff changeset
341 omp_sched_t kind;
kono
parents:
diff changeset
342 int modifier;
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 vars[0].type.src = c_data;
kono
parents:
diff changeset
345 vars[0].type.dst = c_data;
kono
parents:
diff changeset
346 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
347 vars[0].ptr = &kind;
kono
parents:
diff changeset
348
kono
parents:
diff changeset
349 vars[1].type.src = c_data;
kono
parents:
diff changeset
350 vars[1].type.dst = c_data;
kono
parents:
diff changeset
351 vars[1].direction.bits = c_parameter_in;
kono
parents:
diff changeset
352 vars[1].ptr = &modifier;
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
kono
parents:
diff changeset
355 omp_set_schedule(kind, modifier);
kono
parents:
diff changeset
356 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
357 }
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 DLL_LOCAL void omp_get_schedule_lrb(
kono
parents:
diff changeset
360 void *ofld_
kono
parents:
diff changeset
361 )
kono
parents:
diff changeset
362 {
kono
parents:
diff changeset
363 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
364 VarDesc vars[2] = {0};
kono
parents:
diff changeset
365 omp_sched_t kind;
kono
parents:
diff changeset
366 int modifier;
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 vars[0].type.src = c_data;
kono
parents:
diff changeset
369 vars[0].type.dst = c_data;
kono
parents:
diff changeset
370 vars[0].direction.bits = c_parameter_out;
kono
parents:
diff changeset
371 vars[0].ptr = &kind;
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 vars[1].type.src = c_data;
kono
parents:
diff changeset
374 vars[1].type.dst = c_data;
kono
parents:
diff changeset
375 vars[1].direction.bits = c_parameter_out;
kono
parents:
diff changeset
376 vars[1].ptr = &modifier;
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
kono
parents:
diff changeset
379 omp_get_schedule(&kind, &modifier);
kono
parents:
diff changeset
380 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
381 }
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 // lock API functions
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 DLL_LOCAL void omp_init_lock_lrb(
kono
parents:
diff changeset
386 void *ofld_
kono
parents:
diff changeset
387 )
kono
parents:
diff changeset
388 {
kono
parents:
diff changeset
389 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
390 VarDesc vars[1] = {0};
kono
parents:
diff changeset
391 omp_lock_target_t lock;
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 vars[0].type.src = c_data;
kono
parents:
diff changeset
394 vars[0].type.dst = c_data;
kono
parents:
diff changeset
395 vars[0].direction.bits = c_parameter_out;
kono
parents:
diff changeset
396 vars[0].ptr = &lock;
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
399 omp_init_lock(&lock.lock);
kono
parents:
diff changeset
400 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
401 }
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 DLL_LOCAL void omp_destroy_lock_lrb(
kono
parents:
diff changeset
404 void *ofld_
kono
parents:
diff changeset
405 )
kono
parents:
diff changeset
406 {
kono
parents:
diff changeset
407 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
408 VarDesc vars[1] = {0};
kono
parents:
diff changeset
409 omp_lock_target_t lock;
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 vars[0].type.src = c_data;
kono
parents:
diff changeset
412 vars[0].type.dst = c_data;
kono
parents:
diff changeset
413 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
414 vars[0].ptr = &lock;
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
417 omp_destroy_lock(&lock.lock);
kono
parents:
diff changeset
418 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
419 }
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 DLL_LOCAL void omp_set_lock_lrb(
kono
parents:
diff changeset
422 void *ofld_
kono
parents:
diff changeset
423 )
kono
parents:
diff changeset
424 {
kono
parents:
diff changeset
425 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
426 VarDesc vars[1] = {0};
kono
parents:
diff changeset
427 omp_lock_target_t lock;
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 vars[0].type.src = c_data;
kono
parents:
diff changeset
430 vars[0].type.dst = c_data;
kono
parents:
diff changeset
431 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
432 vars[0].ptr = &lock;
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
435 omp_set_lock(&lock.lock);
kono
parents:
diff changeset
436 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
437 }
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 DLL_LOCAL void omp_unset_lock_lrb(
kono
parents:
diff changeset
440 void *ofld_
kono
parents:
diff changeset
441 )
kono
parents:
diff changeset
442 {
kono
parents:
diff changeset
443 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
444 VarDesc vars[1] = {0};
kono
parents:
diff changeset
445 omp_lock_target_t lock;
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 vars[0].type.src = c_data;
kono
parents:
diff changeset
448 vars[0].type.dst = c_data;
kono
parents:
diff changeset
449 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
450 vars[0].ptr = &lock;
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
453 omp_unset_lock(&lock.lock);
kono
parents:
diff changeset
454 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
455 }
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 DLL_LOCAL void omp_test_lock_lrb(
kono
parents:
diff changeset
458 void *ofld_
kono
parents:
diff changeset
459 )
kono
parents:
diff changeset
460 {
kono
parents:
diff changeset
461 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
462 VarDesc vars[2] = {0};
kono
parents:
diff changeset
463 omp_lock_target_t lock;
kono
parents:
diff changeset
464 int result;
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 vars[0].type.src = c_data;
kono
parents:
diff changeset
467 vars[0].type.dst = c_data;
kono
parents:
diff changeset
468 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
469 vars[0].ptr = &lock;
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 vars[1].type.src = c_data;
kono
parents:
diff changeset
472 vars[1].type.dst = c_data;
kono
parents:
diff changeset
473 vars[1].direction.bits = c_parameter_out;
kono
parents:
diff changeset
474 vars[1].ptr = &result;
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
kono
parents:
diff changeset
477 result = omp_test_lock(&lock.lock);
kono
parents:
diff changeset
478 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
479 }
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 // nested lock API functions
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 DLL_LOCAL void omp_init_nest_lock_lrb(
kono
parents:
diff changeset
484 void *ofld_
kono
parents:
diff changeset
485 )
kono
parents:
diff changeset
486 {
kono
parents:
diff changeset
487 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
488 VarDesc vars[1] = {0};
kono
parents:
diff changeset
489 omp_nest_lock_target_t lock;
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 vars[0].type.src = c_data;
kono
parents:
diff changeset
492 vars[0].type.dst = c_data;
kono
parents:
diff changeset
493 vars[0].direction.bits = c_parameter_out;
kono
parents:
diff changeset
494 vars[0].ptr = &lock;
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
497 omp_init_nest_lock(&lock.lock);
kono
parents:
diff changeset
498 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
499 }
kono
parents:
diff changeset
500
kono
parents:
diff changeset
501 DLL_LOCAL void omp_destroy_nest_lock_lrb(
kono
parents:
diff changeset
502 void *ofld_
kono
parents:
diff changeset
503 )
kono
parents:
diff changeset
504 {
kono
parents:
diff changeset
505 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
506 VarDesc vars[1] = {0};
kono
parents:
diff changeset
507 omp_nest_lock_target_t lock;
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 vars[0].type.src = c_data;
kono
parents:
diff changeset
510 vars[0].type.dst = c_data;
kono
parents:
diff changeset
511 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
512 vars[0].ptr = &lock;
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
515 omp_destroy_nest_lock(&lock.lock);
kono
parents:
diff changeset
516 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
517 }
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 DLL_LOCAL void omp_set_nest_lock_lrb(
kono
parents:
diff changeset
520 void *ofld_
kono
parents:
diff changeset
521 )
kono
parents:
diff changeset
522 {
kono
parents:
diff changeset
523 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
524 VarDesc vars[1] = {0};
kono
parents:
diff changeset
525 omp_nest_lock_target_t lock;
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 vars[0].type.src = c_data;
kono
parents:
diff changeset
528 vars[0].type.dst = c_data;
kono
parents:
diff changeset
529 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
530 vars[0].ptr = &lock;
kono
parents:
diff changeset
531
kono
parents:
diff changeset
532 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
533 omp_set_nest_lock(&lock.lock);
kono
parents:
diff changeset
534 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
535 }
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 DLL_LOCAL void omp_unset_nest_lock_lrb(
kono
parents:
diff changeset
538 void *ofld_
kono
parents:
diff changeset
539 )
kono
parents:
diff changeset
540 {
kono
parents:
diff changeset
541 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
542 VarDesc vars[1] = {0};
kono
parents:
diff changeset
543 omp_nest_lock_target_t lock;
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 vars[0].type.src = c_data;
kono
parents:
diff changeset
546 vars[0].type.dst = c_data;
kono
parents:
diff changeset
547 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
548 vars[0].ptr = &lock;
kono
parents:
diff changeset
549
kono
parents:
diff changeset
550 OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
kono
parents:
diff changeset
551 omp_unset_nest_lock(&lock.lock);
kono
parents:
diff changeset
552 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
553 }
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 DLL_LOCAL void omp_test_nest_lock_lrb(
kono
parents:
diff changeset
556 void *ofld_
kono
parents:
diff changeset
557 )
kono
parents:
diff changeset
558 {
kono
parents:
diff changeset
559 OFFLOAD ofld = (OFFLOAD) ofld_;
kono
parents:
diff changeset
560 VarDesc vars[2] = {0};
kono
parents:
diff changeset
561 omp_nest_lock_target_t lock;
kono
parents:
diff changeset
562 int result;
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 vars[0].type.src = c_data;
kono
parents:
diff changeset
565 vars[0].type.dst = c_data;
kono
parents:
diff changeset
566 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
567 vars[0].ptr = &lock;
kono
parents:
diff changeset
568
kono
parents:
diff changeset
569 vars[1].type.src = c_data;
kono
parents:
diff changeset
570 vars[1].type.dst = c_data;
kono
parents:
diff changeset
571 vars[1].direction.bits = c_parameter_out;
kono
parents:
diff changeset
572 vars[1].ptr = &result;
kono
parents:
diff changeset
573
kono
parents:
diff changeset
574 OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
kono
parents:
diff changeset
575 result = omp_test_nest_lock(&lock.lock);
kono
parents:
diff changeset
576 OFFLOAD_TARGET_LEAVE(ofld);
kono
parents:
diff changeset
577 }
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 // Target-side stubs for the host functions (to avoid unresolveds)
kono
parents:
diff changeset
580 // These are needed for the offloadm table
kono
parents:
diff changeset
581
kono
parents:
diff changeset
582 void omp_set_num_threads_target(
kono
parents:
diff changeset
583 TARGET_TYPE target_type,
kono
parents:
diff changeset
584 int target_number,
kono
parents:
diff changeset
585 int num_threads
kono
parents:
diff changeset
586 )
kono
parents:
diff changeset
587 {
kono
parents:
diff changeset
588 }
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 int omp_get_max_threads_target(
kono
parents:
diff changeset
591 TARGET_TYPE target_type,
kono
parents:
diff changeset
592 int target_number
kono
parents:
diff changeset
593 )
kono
parents:
diff changeset
594 {
kono
parents:
diff changeset
595 return 0;
kono
parents:
diff changeset
596 }
kono
parents:
diff changeset
597
kono
parents:
diff changeset
598 int omp_get_num_procs_target(
kono
parents:
diff changeset
599 TARGET_TYPE target_type,
kono
parents:
diff changeset
600 int target_number
kono
parents:
diff changeset
601 )
kono
parents:
diff changeset
602 {
kono
parents:
diff changeset
603 return 0;
kono
parents:
diff changeset
604 }
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 void omp_set_dynamic_target(
kono
parents:
diff changeset
607 TARGET_TYPE target_type,
kono
parents:
diff changeset
608 int target_number,
kono
parents:
diff changeset
609 int num_threads
kono
parents:
diff changeset
610 )
kono
parents:
diff changeset
611 {
kono
parents:
diff changeset
612 }
kono
parents:
diff changeset
613
kono
parents:
diff changeset
614 int omp_get_dynamic_target(
kono
parents:
diff changeset
615 TARGET_TYPE target_type,
kono
parents:
diff changeset
616 int target_number
kono
parents:
diff changeset
617 )
kono
parents:
diff changeset
618 {
kono
parents:
diff changeset
619 return 0;
kono
parents:
diff changeset
620 }
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 void omp_set_nested_target(
kono
parents:
diff changeset
623 TARGET_TYPE target_type,
kono
parents:
diff changeset
624 int target_number,
kono
parents:
diff changeset
625 int num_threads
kono
parents:
diff changeset
626 )
kono
parents:
diff changeset
627 {
kono
parents:
diff changeset
628 }
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 int omp_get_nested_target(
kono
parents:
diff changeset
631 TARGET_TYPE target_type,
kono
parents:
diff changeset
632 int target_number
kono
parents:
diff changeset
633 )
kono
parents:
diff changeset
634 {
kono
parents:
diff changeset
635 return 0;
kono
parents:
diff changeset
636 }
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 void omp_set_schedule_target(
kono
parents:
diff changeset
639 TARGET_TYPE target_type,
kono
parents:
diff changeset
640 int target_number,
kono
parents:
diff changeset
641 omp_sched_t kind,
kono
parents:
diff changeset
642 int modifier
kono
parents:
diff changeset
643 )
kono
parents:
diff changeset
644 {
kono
parents:
diff changeset
645 }
kono
parents:
diff changeset
646
kono
parents:
diff changeset
647 void omp_get_schedule_target(
kono
parents:
diff changeset
648 TARGET_TYPE target_type,
kono
parents:
diff changeset
649 int target_number,
kono
parents:
diff changeset
650 omp_sched_t *kind,
kono
parents:
diff changeset
651 int *modifier
kono
parents:
diff changeset
652 )
kono
parents:
diff changeset
653 {
kono
parents:
diff changeset
654 }
kono
parents:
diff changeset
655
kono
parents:
diff changeset
656 void omp_init_lock_target(
kono
parents:
diff changeset
657 TARGET_TYPE target_type,
kono
parents:
diff changeset
658 int target_number,
kono
parents:
diff changeset
659 omp_lock_target_t *lock
kono
parents:
diff changeset
660 )
kono
parents:
diff changeset
661 {
kono
parents:
diff changeset
662 }
kono
parents:
diff changeset
663
kono
parents:
diff changeset
664 void omp_destroy_lock_target(
kono
parents:
diff changeset
665 TARGET_TYPE target_type,
kono
parents:
diff changeset
666 int target_number,
kono
parents:
diff changeset
667 omp_lock_target_t *lock
kono
parents:
diff changeset
668 )
kono
parents:
diff changeset
669 {
kono
parents:
diff changeset
670 }
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 void omp_set_lock_target(
kono
parents:
diff changeset
673 TARGET_TYPE target_type,
kono
parents:
diff changeset
674 int target_number,
kono
parents:
diff changeset
675 omp_lock_target_t *lock
kono
parents:
diff changeset
676 )
kono
parents:
diff changeset
677 {
kono
parents:
diff changeset
678 }
kono
parents:
diff changeset
679
kono
parents:
diff changeset
680 void omp_unset_lock_target(
kono
parents:
diff changeset
681 TARGET_TYPE target_type,
kono
parents:
diff changeset
682 int target_number,
kono
parents:
diff changeset
683 omp_lock_target_t *lock
kono
parents:
diff changeset
684 )
kono
parents:
diff changeset
685 {
kono
parents:
diff changeset
686 }
kono
parents:
diff changeset
687
kono
parents:
diff changeset
688 int omp_test_lock_target(
kono
parents:
diff changeset
689 TARGET_TYPE target_type,
kono
parents:
diff changeset
690 int target_number,
kono
parents:
diff changeset
691 omp_lock_target_t *lock
kono
parents:
diff changeset
692 )
kono
parents:
diff changeset
693 {
kono
parents:
diff changeset
694 return 0;
kono
parents:
diff changeset
695 }
kono
parents:
diff changeset
696
kono
parents:
diff changeset
697 void omp_init_nest_lock_target(
kono
parents:
diff changeset
698 TARGET_TYPE target_type,
kono
parents:
diff changeset
699 int target_number,
kono
parents:
diff changeset
700 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
701 )
kono
parents:
diff changeset
702 {
kono
parents:
diff changeset
703 }
kono
parents:
diff changeset
704
kono
parents:
diff changeset
705 void omp_destroy_nest_lock_target(
kono
parents:
diff changeset
706 TARGET_TYPE target_type,
kono
parents:
diff changeset
707 int target_number,
kono
parents:
diff changeset
708 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
709 )
kono
parents:
diff changeset
710 {
kono
parents:
diff changeset
711 }
kono
parents:
diff changeset
712
kono
parents:
diff changeset
713 void omp_set_nest_lock_target(
kono
parents:
diff changeset
714 TARGET_TYPE target_type,
kono
parents:
diff changeset
715 int target_number,
kono
parents:
diff changeset
716 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
717 )
kono
parents:
diff changeset
718 {
kono
parents:
diff changeset
719 }
kono
parents:
diff changeset
720
kono
parents:
diff changeset
721 void omp_unset_nest_lock_target(
kono
parents:
diff changeset
722 TARGET_TYPE target_type,
kono
parents:
diff changeset
723 int target_number,
kono
parents:
diff changeset
724 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
725 )
kono
parents:
diff changeset
726 {
kono
parents:
diff changeset
727 }
kono
parents:
diff changeset
728
kono
parents:
diff changeset
729 int omp_test_nest_lock_target(
kono
parents:
diff changeset
730 TARGET_TYPE target_type,
kono
parents:
diff changeset
731 int target_number,
kono
parents:
diff changeset
732 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
733 )
kono
parents:
diff changeset
734 {
kono
parents:
diff changeset
735 return 0;
kono
parents:
diff changeset
736 }