annotate liboffloadmic/runtime/offload_omp_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 <omp.h>
kono
parents:
diff changeset
32 //#include <stdlib.h>
kono
parents:
diff changeset
33 //#include "offload.h"
kono
parents:
diff changeset
34 #include "compiler_if_host.h"
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 // OpenMP API
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 void omp_set_default_device(int num) __GOMP_NOTHROW
kono
parents:
diff changeset
40 {
kono
parents:
diff changeset
41 if (num >= 0) {
kono
parents:
diff changeset
42 __omp_device_num = num;
kono
parents:
diff changeset
43 }
kono
parents:
diff changeset
44 }
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 int omp_get_default_device(void) __GOMP_NOTHROW
kono
parents:
diff changeset
47 {
kono
parents:
diff changeset
48 return __omp_device_num;
kono
parents:
diff changeset
49 }
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 int omp_get_num_devices() __GOMP_NOTHROW
kono
parents:
diff changeset
52 {
kono
parents:
diff changeset
53 __offload_init_library();
kono
parents:
diff changeset
54 return mic_engines_total;
kono
parents:
diff changeset
55 }
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 // OpenMP 4.5 APIs
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 // COI supports 3-dim multiD transfers
kono
parents:
diff changeset
60 #define MAX_ARRAY_RANK 3
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 int omp_get_initial_device(
kono
parents:
diff changeset
63 void
kono
parents:
diff changeset
64 ) __GOMP_NOTHROW
kono
parents:
diff changeset
65 {
kono
parents:
diff changeset
66 return -1;
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 void* omp_target_alloc(
kono
parents:
diff changeset
70 size_t size,
kono
parents:
diff changeset
71 int device_num
kono
parents:
diff changeset
72 ) __GOMP_NOTHROW
kono
parents:
diff changeset
73 {
kono
parents:
diff changeset
74 __offload_init_library();
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 OFFLOAD_TRACE(2, "omp_target_alloc(%lld, %d)\n", size, device_num);
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 if (device_num < -1) {
kono
parents:
diff changeset
79 LIBOFFLOAD_ERROR(c_invalid_device_number);
kono
parents:
diff changeset
80 exit(1);
kono
parents:
diff changeset
81 }
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 void* result = 0;
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 // malloc on CPU
kono
parents:
diff changeset
86 if (device_num == -1) {
kono
parents:
diff changeset
87 // We do not check for malloc returning NULL because the
kono
parents:
diff changeset
88 // specification of this API includes the possibility of failure.
kono
parents:
diff changeset
89 // The user will check the returned result
kono
parents:
diff changeset
90 result = malloc(size);
kono
parents:
diff changeset
91 return result;
kono
parents:
diff changeset
92 }
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(
kono
parents:
diff changeset
95 TARGET_MIC, device_num, 0, NULL, __func__, 0);
kono
parents:
diff changeset
96 if (ofld != 0) {
kono
parents:
diff changeset
97 VarDesc vars[2] = {0};
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 vars[0].type.src = c_data;
kono
parents:
diff changeset
100 vars[0].type.dst = c_data;
kono
parents:
diff changeset
101 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
102 vars[0].size = sizeof(size);
kono
parents:
diff changeset
103 vars[0].count = 1;
kono
parents:
diff changeset
104 vars[0].ptr = &size;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 vars[1].type.src = c_data;
kono
parents:
diff changeset
107 vars[1].type.dst = c_data;
kono
parents:
diff changeset
108 vars[1].direction.bits = c_parameter_out;
kono
parents:
diff changeset
109 vars[1].size = sizeof(result);
kono
parents:
diff changeset
110 vars[1].count = 1;
kono
parents:
diff changeset
111 vars[1].ptr = &result;
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 OFFLOAD_OFFLOAD(ofld, "omp_target_alloc_target",
kono
parents:
diff changeset
114 0, 2, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
115 }
kono
parents:
diff changeset
116 return result;
kono
parents:
diff changeset
117 }
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 void omp_target_free(
kono
parents:
diff changeset
120 void *device_ptr,
kono
parents:
diff changeset
121 int device_num
kono
parents:
diff changeset
122 ) __GOMP_NOTHROW
kono
parents:
diff changeset
123 {
kono
parents:
diff changeset
124 __offload_init_library();
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 OFFLOAD_TRACE(2, "omp_target_free(%p, %d)\n", device_ptr, device_num);
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 if (device_num < -1) {
kono
parents:
diff changeset
129 LIBOFFLOAD_ERROR(c_invalid_device_number);
kono
parents:
diff changeset
130 exit(1);
kono
parents:
diff changeset
131 }
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 // free on CPU
kono
parents:
diff changeset
134 if (device_num == -1) {
kono
parents:
diff changeset
135 free(device_ptr);
kono
parents:
diff changeset
136 return;
kono
parents:
diff changeset
137 }
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(
kono
parents:
diff changeset
140 TARGET_MIC, device_num, 0, NULL, __func__, 0);
kono
parents:
diff changeset
141 if (ofld) {
kono
parents:
diff changeset
142 VarDesc vars[1] = {0};
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 vars[0].type.src = c_data;
kono
parents:
diff changeset
145 vars[0].type.dst = c_data;
kono
parents:
diff changeset
146 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
147 vars[0].size = sizeof(device_ptr);
kono
parents:
diff changeset
148 vars[0].count = 1;
kono
parents:
diff changeset
149 vars[0].ptr = &device_ptr;
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 OFFLOAD_OFFLOAD(ofld, "omp_target_free_target",
kono
parents:
diff changeset
152 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
153 }
kono
parents:
diff changeset
154 }
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 int omp_target_is_present(
kono
parents:
diff changeset
157 void *ptr,
kono
parents:
diff changeset
158 int device_num
kono
parents:
diff changeset
159 ) __GOMP_NOTHROW
kono
parents:
diff changeset
160 {
kono
parents:
diff changeset
161 __offload_init_library();
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 OFFLOAD_TRACE(2, "omp_target_is_present(%p, %d)\n", ptr, device_num);
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 if (device_num < -1) {
kono
parents:
diff changeset
166 LIBOFFLOAD_ERROR(c_invalid_device_number);
kono
parents:
diff changeset
167 exit(1);
kono
parents:
diff changeset
168 }
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 if (device_num == -1) {
kono
parents:
diff changeset
171 return false;
kono
parents:
diff changeset
172 }
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 // If OpenMP allows wrap-around for device numbers, enable next line
kono
parents:
diff changeset
175 //device_num %= mic_engines_total;
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 // lookup existing association in pointer table
kono
parents:
diff changeset
178 PtrData* ptr_data = mic_engines[device_num].find_ptr_data(ptr);
kono
parents:
diff changeset
179 if (ptr_data == 0) {
kono
parents:
diff changeset
180 OFFLOAD_TRACE(3, "Address %p is not mapped on device %d\n",
kono
parents:
diff changeset
181 ptr, device_num);
kono
parents:
diff changeset
182 return false;
kono
parents:
diff changeset
183 }
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 OFFLOAD_TRACE(3, "Address %p found mapped on device %d\n",
kono
parents:
diff changeset
186 ptr, device_num);
kono
parents:
diff changeset
187 return true;
kono
parents:
diff changeset
188 }
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 int omp_target_memcpy(
kono
parents:
diff changeset
191 void *dst,
kono
parents:
diff changeset
192 void *src,
kono
parents:
diff changeset
193 size_t length,
kono
parents:
diff changeset
194 size_t dst_offset,
kono
parents:
diff changeset
195 size_t src_offset,
kono
parents:
diff changeset
196 int dst_device,
kono
parents:
diff changeset
197 int src_device
kono
parents:
diff changeset
198 ) __GOMP_NOTHROW
kono
parents:
diff changeset
199 {
kono
parents:
diff changeset
200 __offload_init_library();
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 OFFLOAD_TRACE(2, "omp_target_memcpy(%p, %p, %lld, %lld, %lld, %d, %d)\n",
kono
parents:
diff changeset
203 dst, src, length, dst_offset, src_offset, dst_device, src_device);
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 if (dst_device < -1 || src_device < -1) {
kono
parents:
diff changeset
206 LIBOFFLOAD_ERROR(c_invalid_device_number);
kono
parents:
diff changeset
207 exit(1);
kono
parents:
diff changeset
208 }
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 char* srcp = (char *)src + src_offset;
kono
parents:
diff changeset
211 char* dstp = (char *)dst + dst_offset;
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 if (src_device == -1) {
kono
parents:
diff changeset
214 // Source is CPU
kono
parents:
diff changeset
215 if (dst_device == -1) {
kono
parents:
diff changeset
216 // CPU -> CPU
kono
parents:
diff changeset
217 memcpy(dstp, srcp, length);
kono
parents:
diff changeset
218 return 0;
kono
parents:
diff changeset
219 } else {
kono
parents:
diff changeset
220 // CPU -> MIC
kono
parents:
diff changeset
221 // COIBufferWrite
kono
parents:
diff changeset
222 // If OpenMP allows wrap-around for device numbers, enable next line
kono
parents:
diff changeset
223 //dst_device %= mic_engines_total;
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 OFFLOAD_TRACE(3, "Creating buffer from sink memory %llx\n", dstp);
kono
parents:
diff changeset
226 COIBUFFER mic_buf;
kono
parents:
diff changeset
227 COIRESULT res = COI::BufferCreateFromMemory(length,
kono
parents:
diff changeset
228 COI_BUFFER_NORMAL, COI_SINK_MEMORY, dstp,
kono
parents:
diff changeset
229 1, &mic_engines[dst_device].get_process(),
kono
parents:
diff changeset
230 &mic_buf);
kono
parents:
diff changeset
231 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
232 LIBOFFLOAD_ERROR(c_buf_create_from_mem, res);
kono
parents:
diff changeset
233 return 1;
kono
parents:
diff changeset
234 }
kono
parents:
diff changeset
235 res = COI::BufferWrite(mic_buf, 0, srcp, length,
kono
parents:
diff changeset
236 COI_COPY_UNSPECIFIED, 0, 0, 0);
kono
parents:
diff changeset
237 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
238 LIBOFFLOAD_ERROR(c_buf_write, res);
kono
parents:
diff changeset
239 return 1;
kono
parents:
diff changeset
240 }
kono
parents:
diff changeset
241 res = COI::BufferDestroy(mic_buf);
kono
parents:
diff changeset
242 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
243 LIBOFFLOAD_ERROR(c_buf_destroy, res);
kono
parents:
diff changeset
244 return 1;
kono
parents:
diff changeset
245 }
kono
parents:
diff changeset
246 return 0;
kono
parents:
diff changeset
247 }
kono
parents:
diff changeset
248 } else {
kono
parents:
diff changeset
249 // Source is device
kono
parents:
diff changeset
250 if (dst_device == -1) {
kono
parents:
diff changeset
251 // MIC -> CPU
kono
parents:
diff changeset
252 // COIBufferRead
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 // If OpenMP allows wrap-around for device numbers, enable next line
kono
parents:
diff changeset
255 //src_device %= mic_engines_total;
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 OFFLOAD_TRACE(3, "Creating buffer from sink memory %llx\n", srcp);
kono
parents:
diff changeset
258 COIBUFFER mic_buf;
kono
parents:
diff changeset
259 COIRESULT res = COI::BufferCreateFromMemory(length,
kono
parents:
diff changeset
260 COI_BUFFER_NORMAL, COI_SINK_MEMORY, srcp,
kono
parents:
diff changeset
261 1, &mic_engines[src_device].get_process(),
kono
parents:
diff changeset
262 &mic_buf);
kono
parents:
diff changeset
263 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
264 LIBOFFLOAD_ERROR(c_buf_create_from_mem, res);
kono
parents:
diff changeset
265 return 1;
kono
parents:
diff changeset
266 }
kono
parents:
diff changeset
267 res = COI::BufferRead(mic_buf, 0, dstp, length,
kono
parents:
diff changeset
268 COI_COPY_UNSPECIFIED, 0, 0, 0);
kono
parents:
diff changeset
269 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
270 LIBOFFLOAD_ERROR(c_buf_read, res);
kono
parents:
diff changeset
271 return 1;
kono
parents:
diff changeset
272 }
kono
parents:
diff changeset
273 res = COI::BufferDestroy(mic_buf);
kono
parents:
diff changeset
274 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
275 LIBOFFLOAD_ERROR(c_buf_destroy, res);
kono
parents:
diff changeset
276 return 1;
kono
parents:
diff changeset
277 }
kono
parents:
diff changeset
278 return 0;
kono
parents:
diff changeset
279 } else {
kono
parents:
diff changeset
280 // some MIC -> some MIC
kono
parents:
diff changeset
281 if (src_device == dst_device) {
kono
parents:
diff changeset
282 // MIC local copy will be done as remote memcpy
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(TARGET_MIC, src_device,
kono
parents:
diff changeset
285 0, NULL, __func__, 0);
kono
parents:
diff changeset
286 if (ofld) {
kono
parents:
diff changeset
287 VarDesc vars[3] = {0};
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 vars[0].type.src = c_data;
kono
parents:
diff changeset
290 vars[0].type.dst = c_data;
kono
parents:
diff changeset
291 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
292 vars[0].size = sizeof(dstp);
kono
parents:
diff changeset
293 vars[0].count = 1;
kono
parents:
diff changeset
294 vars[0].ptr = &dstp;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 vars[1].type.src = c_data;
kono
parents:
diff changeset
297 vars[1].type.dst = c_data;
kono
parents:
diff changeset
298 vars[1].direction.bits = c_parameter_in;
kono
parents:
diff changeset
299 vars[1].size = sizeof(srcp);
kono
parents:
diff changeset
300 vars[1].count = 1;
kono
parents:
diff changeset
301 vars[1].ptr = &srcp;
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 vars[2].type.src = c_data;
kono
parents:
diff changeset
304 vars[2].type.dst = c_data;
kono
parents:
diff changeset
305 vars[2].direction.bits = c_parameter_in;
kono
parents:
diff changeset
306 vars[2].size = sizeof(length);
kono
parents:
diff changeset
307 vars[2].count = 1;
kono
parents:
diff changeset
308 vars[2].ptr = &length;
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 OFFLOAD_OFFLOAD(ofld, "omp_target_memcpy_target",
kono
parents:
diff changeset
311 0, 3, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
312 return 0;
kono
parents:
diff changeset
313 } else {
kono
parents:
diff changeset
314 return 1;
kono
parents:
diff changeset
315 }
kono
parents:
diff changeset
316 } else {
kono
parents:
diff changeset
317 // MICx -> MICy
kono
parents:
diff changeset
318 // Allocate CPU buffer
kono
parents:
diff changeset
319 char *cpu_mem = (char *)malloc(length);
kono
parents:
diff changeset
320 if (cpu_mem == 0) {
kono
parents:
diff changeset
321 LIBOFFLOAD_ERROR(c_malloc);
kono
parents:
diff changeset
322 return 1;
kono
parents:
diff changeset
323 }
kono
parents:
diff changeset
324 int retval = 1;
kono
parents:
diff changeset
325 if (omp_target_memcpy(
kono
parents:
diff changeset
326 cpu_mem, srcp, length, 0, 0, -1, src_device) == 0) {
kono
parents:
diff changeset
327 retval = omp_target_memcpy(
kono
parents:
diff changeset
328 dstp, cpu_mem, length, 0, 0, dst_device, -1);
kono
parents:
diff changeset
329 }
kono
parents:
diff changeset
330 free(cpu_mem);
kono
parents:
diff changeset
331 return retval;
kono
parents:
diff changeset
332 }
kono
parents:
diff changeset
333 }
kono
parents:
diff changeset
334 }
kono
parents:
diff changeset
335 }
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 static size_t bytesize_at_this_dimension(
kono
parents:
diff changeset
338 size_t element_size,
kono
parents:
diff changeset
339 int num_dims,
kono
parents:
diff changeset
340 const size_t* dimensions
kono
parents:
diff changeset
341 )
kono
parents:
diff changeset
342 {
kono
parents:
diff changeset
343 if (num_dims > 1) {
kono
parents:
diff changeset
344 return dimensions[1] *
kono
parents:
diff changeset
345 bytesize_at_this_dimension(
kono
parents:
diff changeset
346 element_size, num_dims-1, dimensions+1);
kono
parents:
diff changeset
347 } else {
kono
parents:
diff changeset
348 return element_size;
kono
parents:
diff changeset
349 }
kono
parents:
diff changeset
350 }
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 static void memcpy_rect(
kono
parents:
diff changeset
353 char *dst,
kono
parents:
diff changeset
354 char *src,
kono
parents:
diff changeset
355 size_t element_size,
kono
parents:
diff changeset
356 int num_dims,
kono
parents:
diff changeset
357 const size_t *volume,
kono
parents:
diff changeset
358 const size_t *dst_offsets,
kono
parents:
diff changeset
359 const size_t *src_offsets,
kono
parents:
diff changeset
360 const size_t *dst_dimensions,
kono
parents:
diff changeset
361 const size_t *src_dimensions
kono
parents:
diff changeset
362 )
kono
parents:
diff changeset
363 {
kono
parents:
diff changeset
364 if (num_dims > 1) {
kono
parents:
diff changeset
365 int count = volume[0];
kono
parents:
diff changeset
366 int dst_index = dst_offsets[0];
kono
parents:
diff changeset
367 int src_index = src_offsets[0];
kono
parents:
diff changeset
368 size_t dst_element_size =
kono
parents:
diff changeset
369 bytesize_at_this_dimension(element_size, num_dims, dst_dimensions);
kono
parents:
diff changeset
370 size_t src_element_size =
kono
parents:
diff changeset
371 bytesize_at_this_dimension(element_size, num_dims, src_dimensions);
kono
parents:
diff changeset
372 for (; count>0; dst_index++, src_index++, count--) {
kono
parents:
diff changeset
373 memcpy_rect(dst+dst_element_size*dst_index,
kono
parents:
diff changeset
374 src+src_element_size*src_index,
kono
parents:
diff changeset
375 element_size, num_dims-1, volume+1,
kono
parents:
diff changeset
376 dst_offsets+1, src_offsets+1,
kono
parents:
diff changeset
377 dst_dimensions+1, src_dimensions+1);
kono
parents:
diff changeset
378 }
kono
parents:
diff changeset
379 } else {
kono
parents:
diff changeset
380 memcpy(dst+dst_offsets[0]*element_size,
kono
parents:
diff changeset
381 src+src_offsets[0]*element_size,
kono
parents:
diff changeset
382 element_size * volume[0]);
kono
parents:
diff changeset
383 }
kono
parents:
diff changeset
384 }
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 int omp_target_memcpy_rect(
kono
parents:
diff changeset
387 void *dst_,
kono
parents:
diff changeset
388 void *src_,
kono
parents:
diff changeset
389 size_t element_size,
kono
parents:
diff changeset
390 int num_dims,
kono
parents:
diff changeset
391 const size_t *volume,
kono
parents:
diff changeset
392 const size_t *dst_offsets,
kono
parents:
diff changeset
393 const size_t *src_offsets,
kono
parents:
diff changeset
394 const size_t *dst_dimensions,
kono
parents:
diff changeset
395 const size_t *src_dimensions,
kono
parents:
diff changeset
396 int dst_device,
kono
parents:
diff changeset
397 int src_device
kono
parents:
diff changeset
398 ) __GOMP_NOTHROW
kono
parents:
diff changeset
399 {
kono
parents:
diff changeset
400 char *dst = (char *)dst_;
kono
parents:
diff changeset
401 char *src = (char *)src_;
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 __offload_init_library();
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 OFFLOAD_TRACE(2, "omp_target_memcpy_rect(%p, %p, %lld, %d, "
kono
parents:
diff changeset
406 "%p, %p, %p, %p, %p, %d, %d)\n",
kono
parents:
diff changeset
407 dst, src, element_size, num_dims,
kono
parents:
diff changeset
408 volume, dst_offsets, src_offsets,
kono
parents:
diff changeset
409 dst_dimensions, src_dimensions, dst_device, src_device);
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 // MAX_ARRAY_RANK dimensions are supported
kono
parents:
diff changeset
412 if (dst == 0 && src == 0) {
kono
parents:
diff changeset
413 return MAX_ARRAY_RANK;
kono
parents:
diff changeset
414 }
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 if (num_dims < 1 || num_dims > MAX_ARRAY_RANK ||
kono
parents:
diff changeset
417 element_size < 1 ||
kono
parents:
diff changeset
418 volume == 0 || dst_offsets == 0 || src_offsets == 0 ||
kono
parents:
diff changeset
419 dst_dimensions == 0 || src_dimensions == 0) {
kono
parents:
diff changeset
420 return 1;
kono
parents:
diff changeset
421 }
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 if (dst_device < -1 || src_device < -1) {
kono
parents:
diff changeset
424 LIBOFFLOAD_ERROR(c_invalid_device_number);
kono
parents:
diff changeset
425 exit(1);
kono
parents:
diff changeset
426 }
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 if (src_device == -1) {
kono
parents:
diff changeset
429 // Source is CPU
kono
parents:
diff changeset
430 if (dst_device == -1) {
kono
parents:
diff changeset
431 // CPU -> CPU
kono
parents:
diff changeset
432 memcpy_rect((char*)dst, (char*)src, element_size, num_dims, volume,
kono
parents:
diff changeset
433 dst_offsets, src_offsets,
kono
parents:
diff changeset
434 dst_dimensions, src_dimensions);
kono
parents:
diff changeset
435 return 0;
kono
parents:
diff changeset
436 } else {
kono
parents:
diff changeset
437 // CPU -> MIC
kono
parents:
diff changeset
438 // COIBufferWriteMultiD
kono
parents:
diff changeset
439 struct arr_desc dst_desc;
kono
parents:
diff changeset
440 struct arr_desc src_desc;
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 dst_desc.base = (int64_t)dst;
kono
parents:
diff changeset
443 dst_desc.rank = num_dims;
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 src_desc.base = (int64_t)src;
kono
parents:
diff changeset
446 src_desc.rank = num_dims;
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 for (int i=0; i<num_dims; i++)
kono
parents:
diff changeset
449 {
kono
parents:
diff changeset
450 dst_desc.dim[i].size = bytesize_at_this_dimension(
kono
parents:
diff changeset
451 element_size,
kono
parents:
diff changeset
452 num_dims - i,
kono
parents:
diff changeset
453 dst_dimensions + i);
kono
parents:
diff changeset
454 dst_desc.dim[i].lindex = 0;
kono
parents:
diff changeset
455 dst_desc.dim[i].lower = dst_offsets[i];
kono
parents:
diff changeset
456 dst_desc.dim[i].upper = dst_offsets[i] + volume[i] - 1;
kono
parents:
diff changeset
457 dst_desc.dim[i].stride = 1;
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 src_desc.dim[i].size = bytesize_at_this_dimension(
kono
parents:
diff changeset
460 element_size,
kono
parents:
diff changeset
461 num_dims - i,
kono
parents:
diff changeset
462 src_dimensions + i);
kono
parents:
diff changeset
463 src_desc.dim[i].lindex = 0;
kono
parents:
diff changeset
464 src_desc.dim[i].lower = src_offsets[i];
kono
parents:
diff changeset
465 src_desc.dim[i].upper = src_offsets[i] + volume[i] - 1;
kono
parents:
diff changeset
466 src_desc.dim[i].stride = 1;
kono
parents:
diff changeset
467 }
kono
parents:
diff changeset
468 __arr_desc_dump("", "dst", (const Arr_Desc*)&dst_desc, false, false);
kono
parents:
diff changeset
469 __arr_desc_dump("", "src", (const Arr_Desc*)&src_desc, false, false);
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 // If OpenMP allows wrap-around for device numbers, enable next line
kono
parents:
diff changeset
472 //dst_device %= mic_engines_total;
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 // Compute MIC buffer size
kono
parents:
diff changeset
475 size_t dst_length = dst_dimensions[0] * bytesize_at_this_dimension(
kono
parents:
diff changeset
476 element_size,
kono
parents:
diff changeset
477 num_dims,
kono
parents:
diff changeset
478 dst_dimensions);
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 OFFLOAD_TRACE(3,
kono
parents:
diff changeset
481 "Creating buffer from sink memory %llx of size %lld\n",
kono
parents:
diff changeset
482 dst, dst_length);
kono
parents:
diff changeset
483 COIBUFFER mic_buf;
kono
parents:
diff changeset
484 COIRESULT res = COI::BufferCreateFromMemory(dst_length,
kono
parents:
diff changeset
485 COI_BUFFER_NORMAL, COI_SINK_MEMORY, dst,
kono
parents:
diff changeset
486 1, &mic_engines[dst_device].get_process(),
kono
parents:
diff changeset
487 &mic_buf);
kono
parents:
diff changeset
488 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
489 LIBOFFLOAD_ERROR(c_buf_create_from_mem, res);
kono
parents:
diff changeset
490 return 1;
kono
parents:
diff changeset
491 }
kono
parents:
diff changeset
492 res = COI::BufferWriteMultiD(mic_buf,
kono
parents:
diff changeset
493 mic_engines[dst_device].get_process(),
kono
parents:
diff changeset
494 0, &dst_desc, &src_desc,
kono
parents:
diff changeset
495 COI_COPY_UNSPECIFIED, 0, 0, 0);
kono
parents:
diff changeset
496 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
497 LIBOFFLOAD_ERROR(c_buf_write, res);
kono
parents:
diff changeset
498 return 1;
kono
parents:
diff changeset
499 }
kono
parents:
diff changeset
500 res = COI::BufferDestroy(mic_buf);
kono
parents:
diff changeset
501 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
502 LIBOFFLOAD_ERROR(c_buf_destroy, res);
kono
parents:
diff changeset
503 return 1;
kono
parents:
diff changeset
504 }
kono
parents:
diff changeset
505 return 0;
kono
parents:
diff changeset
506 }
kono
parents:
diff changeset
507 } else {
kono
parents:
diff changeset
508 // Source is device
kono
parents:
diff changeset
509 if (dst_device == -1) {
kono
parents:
diff changeset
510 // COIBufferReadMultiD
kono
parents:
diff changeset
511 struct arr_desc dst_desc;
kono
parents:
diff changeset
512 struct arr_desc src_desc;
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 dst_desc.base = (int64_t)dst;
kono
parents:
diff changeset
515 dst_desc.rank = num_dims;
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 src_desc.base = (int64_t)src;
kono
parents:
diff changeset
518 src_desc.rank = num_dims;
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 for (int i=0; i<num_dims; i++)
kono
parents:
diff changeset
521 {
kono
parents:
diff changeset
522 dst_desc.dim[i].size = bytesize_at_this_dimension(
kono
parents:
diff changeset
523 element_size,
kono
parents:
diff changeset
524 num_dims - i,
kono
parents:
diff changeset
525 dst_dimensions + i);
kono
parents:
diff changeset
526 dst_desc.dim[i].lindex = 0;
kono
parents:
diff changeset
527 dst_desc.dim[i].lower = dst_offsets[i];
kono
parents:
diff changeset
528 dst_desc.dim[i].upper = dst_offsets[i] + volume[i] - 1;
kono
parents:
diff changeset
529 dst_desc.dim[i].stride = 1;
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 src_desc.dim[i].size = bytesize_at_this_dimension(
kono
parents:
diff changeset
532 element_size,
kono
parents:
diff changeset
533 num_dims - i,
kono
parents:
diff changeset
534 src_dimensions + i);
kono
parents:
diff changeset
535 src_desc.dim[i].lindex = 0;
kono
parents:
diff changeset
536 src_desc.dim[i].lower = src_offsets[i];
kono
parents:
diff changeset
537 src_desc.dim[i].upper = src_offsets[i] + volume[i] - 1;
kono
parents:
diff changeset
538 src_desc.dim[i].stride = 1;
kono
parents:
diff changeset
539 }
kono
parents:
diff changeset
540 __arr_desc_dump("", "dst", (const Arr_Desc*)&dst_desc, false, false);
kono
parents:
diff changeset
541 __arr_desc_dump("", "src", (const Arr_Desc*)&src_desc, false, false);
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 // If OpenMP allows wrap-around for device numbers, enable next line
kono
parents:
diff changeset
544 //src_device %= mic_engines_total;
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 // Compute MIC buffer size
kono
parents:
diff changeset
547 size_t src_length = src_dimensions[0] * bytesize_at_this_dimension(
kono
parents:
diff changeset
548 element_size,
kono
parents:
diff changeset
549 num_dims,
kono
parents:
diff changeset
550 src_dimensions);
kono
parents:
diff changeset
551
kono
parents:
diff changeset
552 OFFLOAD_TRACE(3,
kono
parents:
diff changeset
553 "Creating buffer from sink memory %llx of size %lld\n",
kono
parents:
diff changeset
554 src, src_length);
kono
parents:
diff changeset
555 COIBUFFER mic_buf;
kono
parents:
diff changeset
556 COIRESULT res = COI::BufferCreateFromMemory(src_length,
kono
parents:
diff changeset
557 COI_BUFFER_NORMAL, COI_SINK_MEMORY, src,
kono
parents:
diff changeset
558 1, &mic_engines[src_device].get_process(),
kono
parents:
diff changeset
559 &mic_buf);
kono
parents:
diff changeset
560 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
561 LIBOFFLOAD_ERROR(c_buf_create_from_mem, res);
kono
parents:
diff changeset
562 return 1;
kono
parents:
diff changeset
563 }
kono
parents:
diff changeset
564 res = COI::BufferReadMultiD(mic_buf, 0,
kono
parents:
diff changeset
565 &dst_desc, &src_desc,
kono
parents:
diff changeset
566 COI_COPY_UNSPECIFIED, 0, 0, 0);
kono
parents:
diff changeset
567 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
568 LIBOFFLOAD_ERROR(c_buf_write, res);
kono
parents:
diff changeset
569 return 1;
kono
parents:
diff changeset
570 }
kono
parents:
diff changeset
571 res = COI::BufferDestroy(mic_buf);
kono
parents:
diff changeset
572 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
573 LIBOFFLOAD_ERROR(c_buf_destroy, res);
kono
parents:
diff changeset
574 return 1;
kono
parents:
diff changeset
575 }
kono
parents:
diff changeset
576 return 0;
kono
parents:
diff changeset
577 } else {
kono
parents:
diff changeset
578 // some MIC -> some MIC
kono
parents:
diff changeset
579 if (src_device == dst_device) {
kono
parents:
diff changeset
580 // MIC local copy will be done as remote memcpy_rect
kono
parents:
diff changeset
581 struct parameters {
kono
parents:
diff changeset
582 void *dst;
kono
parents:
diff changeset
583 void *src;
kono
parents:
diff changeset
584 size_t element_size;
kono
parents:
diff changeset
585 int num_dims;
kono
parents:
diff changeset
586 size_t array_info[MAX_ARRAY_RANK*5];
kono
parents:
diff changeset
587 } parameters = {dst, src, element_size, num_dims};
kono
parents:
diff changeset
588 int result;
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 for (int i=0; i<num_dims; i++)
kono
parents:
diff changeset
591 {
kono
parents:
diff changeset
592 parameters.array_info[i] = volume[i];
kono
parents:
diff changeset
593 parameters.array_info[i+num_dims] = dst_offsets[i];
kono
parents:
diff changeset
594 parameters.array_info[i+num_dims*2] = src_offsets[i];
kono
parents:
diff changeset
595 parameters.array_info[i+num_dims*3] = dst_dimensions[i];
kono
parents:
diff changeset
596 parameters.array_info[i+num_dims*4] = src_dimensions[i];
kono
parents:
diff changeset
597 }
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(TARGET_MIC, src_device,
kono
parents:
diff changeset
600 0, NULL, __func__, 0);
kono
parents:
diff changeset
601 if (ofld) {
kono
parents:
diff changeset
602 VarDesc vars[1] = {0};
kono
parents:
diff changeset
603
kono
parents:
diff changeset
604 vars[0].type.src = c_data;
kono
parents:
diff changeset
605 vars[0].type.dst = c_data;
kono
parents:
diff changeset
606 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
607 vars[0].size = sizeof(parameters) -
kono
parents:
diff changeset
608 (MAX_ARRAY_RANK - num_dims) *
kono
parents:
diff changeset
609 5 * sizeof(size_t);
kono
parents:
diff changeset
610 vars[0].count = 1;
kono
parents:
diff changeset
611 vars[0].ptr = &parameters;
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 OFFLOAD_OFFLOAD(ofld, "omp_target_memcpy_rect_target",
kono
parents:
diff changeset
614 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
615 return 0;
kono
parents:
diff changeset
616 } else {
kono
parents:
diff changeset
617 return 1;
kono
parents:
diff changeset
618 }
kono
parents:
diff changeset
619 } else {
kono
parents:
diff changeset
620 // MICx -> MICy
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 // Compute transfer byte-count
kono
parents:
diff changeset
623 size_t dst_length = element_size;
kono
parents:
diff changeset
624 for (int i=0; i<num_dims; i++) {
kono
parents:
diff changeset
625 dst_length *= volume[i];
kono
parents:
diff changeset
626 }
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 // Allocate CPU buffer
kono
parents:
diff changeset
629 char *cpu_mem = (char *)malloc(dst_length);
kono
parents:
diff changeset
630 if (cpu_mem == 0) {
kono
parents:
diff changeset
631 LIBOFFLOAD_ERROR(c_malloc);
kono
parents:
diff changeset
632 return 1;
kono
parents:
diff changeset
633 }
kono
parents:
diff changeset
634
kono
parents:
diff changeset
635 // Create CPU offset and dimension arrays
kono
parents:
diff changeset
636 // The CPU array collects the data in a contiguous block
kono
parents:
diff changeset
637 size_t cpu_offsets[MAX_ARRAY_RANK];
kono
parents:
diff changeset
638 size_t cpu_dimensions[MAX_ARRAY_RANK];
kono
parents:
diff changeset
639 for (int i=0; i<num_dims; i++) {
kono
parents:
diff changeset
640 cpu_offsets[i] = 0;
kono
parents:
diff changeset
641 cpu_dimensions[i] = volume[i];
kono
parents:
diff changeset
642 }
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 int retval = 1;
kono
parents:
diff changeset
645 if (omp_target_memcpy_rect(
kono
parents:
diff changeset
646 cpu_mem, src, element_size, num_dims, volume,
kono
parents:
diff changeset
647 cpu_offsets, src_offsets,
kono
parents:
diff changeset
648 cpu_dimensions, src_dimensions,
kono
parents:
diff changeset
649 -1, src_device) == 0) {
kono
parents:
diff changeset
650 retval = omp_target_memcpy_rect(
kono
parents:
diff changeset
651 dst, cpu_mem, element_size, num_dims, volume,
kono
parents:
diff changeset
652 dst_offsets, cpu_offsets,
kono
parents:
diff changeset
653 dst_dimensions, cpu_dimensions,
kono
parents:
diff changeset
654 dst_device, -1);
kono
parents:
diff changeset
655 }
kono
parents:
diff changeset
656 free(cpu_mem);
kono
parents:
diff changeset
657 return retval;
kono
parents:
diff changeset
658 }
kono
parents:
diff changeset
659 }
kono
parents:
diff changeset
660 }
kono
parents:
diff changeset
661 }
kono
parents:
diff changeset
662
kono
parents:
diff changeset
663 // host_ptr is key in table that yields association on device
kono
parents:
diff changeset
664 // A COIBUFFER of specified size is created from the memory at
kono
parents:
diff changeset
665 // device_ptr+device_offset on device_num
kono
parents:
diff changeset
666 int omp_target_associate_ptr(
kono
parents:
diff changeset
667 void *host_ptr,
kono
parents:
diff changeset
668 void *device_ptr,
kono
parents:
diff changeset
669 size_t size,
kono
parents:
diff changeset
670 size_t device_offset,
kono
parents:
diff changeset
671 int device_num
kono
parents:
diff changeset
672 ) __GOMP_NOTHROW
kono
parents:
diff changeset
673 {
kono
parents:
diff changeset
674 COIRESULT res;
kono
parents:
diff changeset
675
kono
parents:
diff changeset
676 __offload_init_library();
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 OFFLOAD_TRACE(2, "omp_target_associate_ptr(%p, %p, %lld, %lld, %d)\n",
kono
parents:
diff changeset
679 host_ptr, device_ptr, size, device_offset, device_num);
kono
parents:
diff changeset
680
kono
parents:
diff changeset
681 if (device_num < -1) {
kono
parents:
diff changeset
682 LIBOFFLOAD_ERROR(c_invalid_device_number);
kono
parents:
diff changeset
683 exit(1);
kono
parents:
diff changeset
684 }
kono
parents:
diff changeset
685
kono
parents:
diff changeset
686 // Associating to CPU is treated as failure
kono
parents:
diff changeset
687 if (device_num == -1) {
kono
parents:
diff changeset
688 return 1;
kono
parents:
diff changeset
689 }
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 // An incorrect size is treated as failure
kono
parents:
diff changeset
692 if (size < 0) {
kono
parents:
diff changeset
693 return 1;
kono
parents:
diff changeset
694 }
kono
parents:
diff changeset
695
kono
parents:
diff changeset
696 // If OpenMP allows wrap-around for device numbers, enable next line
kono
parents:
diff changeset
697 //Engine& device = mic_engines[device_num % mic_engines_total];
kono
parents:
diff changeset
698 Engine& device = mic_engines[device_num];
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 // Does host pointer have association already?
kono
parents:
diff changeset
701 // lookup existing association in pointer table
kono
parents:
diff changeset
702 PtrData* ptr_data = device.find_ptr_data(host_ptr);
kono
parents:
diff changeset
703 if (ptr_data != 0) {
kono
parents:
diff changeset
704 OFFLOAD_TRACE(3, "Address %p is already mapped on device %d\n",
kono
parents:
diff changeset
705 host_ptr, device_num);
kono
parents:
diff changeset
706 // Is current device pointer and offset same as existing?
kono
parents:
diff changeset
707 if ((void*)ptr_data->mic_addr == device_ptr &&
kono
parents:
diff changeset
708 (size_t)ptr_data->alloc_disp == device_offset) {
kono
parents:
diff changeset
709 return 0;
kono
parents:
diff changeset
710 } else {
kono
parents:
diff changeset
711 return 1;
kono
parents:
diff changeset
712 }
kono
parents:
diff changeset
713 }
kono
parents:
diff changeset
714
kono
parents:
diff changeset
715 // Create association
kono
parents:
diff changeset
716 OFFLOAD_TRACE(3, "Creating association for data: addr %p, length %lld\n",
kono
parents:
diff changeset
717 host_ptr, size);
kono
parents:
diff changeset
718
kono
parents:
diff changeset
719 bool is_new;
kono
parents:
diff changeset
720 ptr_data = device.insert_ptr_data(host_ptr, size, is_new);
kono
parents:
diff changeset
721 ptr_data->is_omp_associate = true;
kono
parents:
diff changeset
722
kono
parents:
diff changeset
723 // create CPU buffer
kono
parents:
diff changeset
724 OFFLOAD_TRACE(3,
kono
parents:
diff changeset
725 "Creating buffer from source memory %p, length %lld\n",
kono
parents:
diff changeset
726 host_ptr, size);
kono
parents:
diff changeset
727
kono
parents:
diff changeset
728 // result is not checked because we can continue without cpu
kono
parents:
diff changeset
729 // buffer. In this case we will use COIBufferRead/Write
kono
parents:
diff changeset
730 // instead of COIBufferCopy.
kono
parents:
diff changeset
731
kono
parents:
diff changeset
732 COI::BufferCreateFromMemory(size,
kono
parents:
diff changeset
733 COI_BUFFER_OPENCL,
kono
parents:
diff changeset
734 0,
kono
parents:
diff changeset
735 host_ptr,
kono
parents:
diff changeset
736 1,
kono
parents:
diff changeset
737 &device.get_process(),
kono
parents:
diff changeset
738 &ptr_data->cpu_buf);
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 // create MIC buffer
kono
parents:
diff changeset
741 OFFLOAD_TRACE(3,
kono
parents:
diff changeset
742 "Creating buffer from sink memory: addr %p, size %lld\n",
kono
parents:
diff changeset
743 (char *)device_ptr + device_offset, size);
kono
parents:
diff changeset
744 res = COI::BufferCreateFromMemory(size,
kono
parents:
diff changeset
745 COI_BUFFER_NORMAL,
kono
parents:
diff changeset
746 COI_SINK_MEMORY,
kono
parents:
diff changeset
747 device_ptr,
kono
parents:
diff changeset
748 1,
kono
parents:
diff changeset
749 &device.get_process(),
kono
parents:
diff changeset
750 &ptr_data->mic_buf);
kono
parents:
diff changeset
751 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
752 ptr_data->alloc_ptr_data_lock.unlock();
kono
parents:
diff changeset
753 return 1;
kono
parents:
diff changeset
754 }
kono
parents:
diff changeset
755
kono
parents:
diff changeset
756 // make buffer valid on the device.
kono
parents:
diff changeset
757 res = COI::BufferSetState(ptr_data->mic_buf,
kono
parents:
diff changeset
758 device.get_process(),
kono
parents:
diff changeset
759 COI_BUFFER_VALID,
kono
parents:
diff changeset
760 COI_BUFFER_NO_MOVE,
kono
parents:
diff changeset
761 0, 0, 0);
kono
parents:
diff changeset
762 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
763 ptr_data->alloc_ptr_data_lock.unlock();
kono
parents:
diff changeset
764 return 1;
kono
parents:
diff changeset
765 }
kono
parents:
diff changeset
766
kono
parents:
diff changeset
767 res = COI::BufferSetState(ptr_data->mic_buf,
kono
parents:
diff changeset
768 COI_PROCESS_SOURCE,
kono
parents:
diff changeset
769 COI_BUFFER_INVALID,
kono
parents:
diff changeset
770 COI_BUFFER_NO_MOVE,
kono
parents:
diff changeset
771 0, 0, 0);
kono
parents:
diff changeset
772 if (res != COI_SUCCESS) {
kono
parents:
diff changeset
773 ptr_data->alloc_ptr_data_lock.unlock();
kono
parents:
diff changeset
774 return 1;
kono
parents:
diff changeset
775 }
kono
parents:
diff changeset
776 ptr_data->alloc_disp = device_offset;
kono
parents:
diff changeset
777 ptr_data->alloc_ptr_data_lock.unlock();
kono
parents:
diff changeset
778
kono
parents:
diff changeset
779 return 0;
kono
parents:
diff changeset
780 }
kono
parents:
diff changeset
781
kono
parents:
diff changeset
782 int omp_target_disassociate_ptr(
kono
parents:
diff changeset
783 void *host_ptr,
kono
parents:
diff changeset
784 int device_num
kono
parents:
diff changeset
785 ) __GOMP_NOTHROW
kono
parents:
diff changeset
786 {
kono
parents:
diff changeset
787 COIRESULT res;
kono
parents:
diff changeset
788
kono
parents:
diff changeset
789 __offload_init_library();
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 OFFLOAD_TRACE(2, "omp_target_disassociate_ptr(%p, %d)\n",
kono
parents:
diff changeset
792 host_ptr, device_num);
kono
parents:
diff changeset
793
kono
parents:
diff changeset
794 if (device_num < -1) {
kono
parents:
diff changeset
795 LIBOFFLOAD_ERROR(c_invalid_device_number);
kono
parents:
diff changeset
796 exit(1);
kono
parents:
diff changeset
797 }
kono
parents:
diff changeset
798
kono
parents:
diff changeset
799 // Dissociating from CPU is treated as failure
kono
parents:
diff changeset
800 if (device_num == -1) {
kono
parents:
diff changeset
801 return 1;
kono
parents:
diff changeset
802 }
kono
parents:
diff changeset
803
kono
parents:
diff changeset
804 // If OpenMP allows wrap-around for device numbers, enable next line
kono
parents:
diff changeset
805 //Engine& device = mic_engines[device_num % mic_engines_total];
kono
parents:
diff changeset
806 Engine& device = mic_engines[device_num];
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 // Lookup existing association in pointer table
kono
parents:
diff changeset
809 PtrData* ptr_data = device.find_ptr_data(host_ptr);
kono
parents:
diff changeset
810
kono
parents:
diff changeset
811 // Attempt to disassociate unassociated pointer is a failure
kono
parents:
diff changeset
812 if (ptr_data == 0) {
kono
parents:
diff changeset
813 return 1;
kono
parents:
diff changeset
814 }
kono
parents:
diff changeset
815
kono
parents:
diff changeset
816 // Destroy buffers
kono
parents:
diff changeset
817 if (ptr_data->cpu_buf != 0) {
kono
parents:
diff changeset
818 OFFLOAD_TRACE(3, "Destroying CPU buffer %p\n", ptr_data->cpu_buf);
kono
parents:
diff changeset
819 COI::BufferDestroy(ptr_data->cpu_buf);
kono
parents:
diff changeset
820 }
kono
parents:
diff changeset
821 if (ptr_data->mic_buf != 0) {
kono
parents:
diff changeset
822 OFFLOAD_TRACE(3, "Destroying MIC buffer %p\n", ptr_data->mic_buf);
kono
parents:
diff changeset
823 COI::BufferDestroy(ptr_data->mic_buf);
kono
parents:
diff changeset
824 }
kono
parents:
diff changeset
825
kono
parents:
diff changeset
826 // Remove association from map
kono
parents:
diff changeset
827 OFFLOAD_TRACE(3, "Removing association for addr %p\n",
kono
parents:
diff changeset
828 ptr_data->cpu_addr.start());
kono
parents:
diff changeset
829 device.remove_ptr_data(ptr_data->cpu_addr.start());
kono
parents:
diff changeset
830
kono
parents:
diff changeset
831 return 0;
kono
parents:
diff changeset
832 }
kono
parents:
diff changeset
833
kono
parents:
diff changeset
834 // End of OpenMP 4.5 APIs
kono
parents:
diff changeset
835
kono
parents:
diff changeset
836
kono
parents:
diff changeset
837 // OpenMP API wrappers
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 static void omp_set_int_target(
kono
parents:
diff changeset
840 TARGET_TYPE target_type,
kono
parents:
diff changeset
841 int target_number,
kono
parents:
diff changeset
842 int setting,
kono
parents:
diff changeset
843 const char* f_name
kono
parents:
diff changeset
844 )
kono
parents:
diff changeset
845 {
kono
parents:
diff changeset
846 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
847 f_name, 0);
kono
parents:
diff changeset
848 if (ofld) {
kono
parents:
diff changeset
849 VarDesc vars[1] = {0};
kono
parents:
diff changeset
850
kono
parents:
diff changeset
851 vars[0].type.src = c_data;
kono
parents:
diff changeset
852 vars[0].type.dst = c_data;
kono
parents:
diff changeset
853 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
854 vars[0].size = sizeof(int);
kono
parents:
diff changeset
855 vars[0].count = 1;
kono
parents:
diff changeset
856 vars[0].ptr = &setting;
kono
parents:
diff changeset
857
kono
parents:
diff changeset
858 OFFLOAD_OFFLOAD(ofld, f_name, 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
859 }
kono
parents:
diff changeset
860 }
kono
parents:
diff changeset
861
kono
parents:
diff changeset
862 static int omp_get_int_target(
kono
parents:
diff changeset
863 TARGET_TYPE target_type,
kono
parents:
diff changeset
864 int target_number,
kono
parents:
diff changeset
865 const char * f_name
kono
parents:
diff changeset
866 )
kono
parents:
diff changeset
867 {
kono
parents:
diff changeset
868 int setting = 0;
kono
parents:
diff changeset
869
kono
parents:
diff changeset
870 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
871 f_name, 0);
kono
parents:
diff changeset
872 if (ofld) {
kono
parents:
diff changeset
873 VarDesc vars[1] = {0};
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 vars[0].type.src = c_data;
kono
parents:
diff changeset
876 vars[0].type.dst = c_data;
kono
parents:
diff changeset
877 vars[0].direction.bits = c_parameter_out;
kono
parents:
diff changeset
878 vars[0].size = sizeof(int);
kono
parents:
diff changeset
879 vars[0].count = 1;
kono
parents:
diff changeset
880 vars[0].ptr = &setting;
kono
parents:
diff changeset
881
kono
parents:
diff changeset
882 OFFLOAD_OFFLOAD(ofld, f_name, 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
883 }
kono
parents:
diff changeset
884 return setting;
kono
parents:
diff changeset
885 }
kono
parents:
diff changeset
886
kono
parents:
diff changeset
887 void omp_set_num_threads_target(
kono
parents:
diff changeset
888 TARGET_TYPE target_type,
kono
parents:
diff changeset
889 int target_number,
kono
parents:
diff changeset
890 int num_threads
kono
parents:
diff changeset
891 )
kono
parents:
diff changeset
892 {
kono
parents:
diff changeset
893 omp_set_int_target(target_type, target_number, num_threads,
kono
parents:
diff changeset
894 "omp_set_num_threads_target");
kono
parents:
diff changeset
895 }
kono
parents:
diff changeset
896
kono
parents:
diff changeset
897 int omp_get_max_threads_target(
kono
parents:
diff changeset
898 TARGET_TYPE target_type,
kono
parents:
diff changeset
899 int target_number
kono
parents:
diff changeset
900 )
kono
parents:
diff changeset
901 {
kono
parents:
diff changeset
902 return omp_get_int_target(target_type, target_number,
kono
parents:
diff changeset
903 "omp_get_max_threads_target");
kono
parents:
diff changeset
904 }
kono
parents:
diff changeset
905
kono
parents:
diff changeset
906 int omp_get_num_procs_target(
kono
parents:
diff changeset
907 TARGET_TYPE target_type,
kono
parents:
diff changeset
908 int target_number
kono
parents:
diff changeset
909 )
kono
parents:
diff changeset
910 {
kono
parents:
diff changeset
911 return omp_get_int_target(target_type, target_number,
kono
parents:
diff changeset
912 "omp_get_num_procs_target");
kono
parents:
diff changeset
913 }
kono
parents:
diff changeset
914
kono
parents:
diff changeset
915 void omp_set_dynamic_target(
kono
parents:
diff changeset
916 TARGET_TYPE target_type,
kono
parents:
diff changeset
917 int target_number,
kono
parents:
diff changeset
918 int num_threads
kono
parents:
diff changeset
919 )
kono
parents:
diff changeset
920 {
kono
parents:
diff changeset
921 omp_set_int_target(target_type, target_number, num_threads,
kono
parents:
diff changeset
922 "omp_set_dynamic_target");
kono
parents:
diff changeset
923 }
kono
parents:
diff changeset
924
kono
parents:
diff changeset
925 int omp_get_dynamic_target(
kono
parents:
diff changeset
926 TARGET_TYPE target_type,
kono
parents:
diff changeset
927 int target_number
kono
parents:
diff changeset
928 )
kono
parents:
diff changeset
929 {
kono
parents:
diff changeset
930 return omp_get_int_target(target_type, target_number,
kono
parents:
diff changeset
931 "omp_get_dynamic_target");
kono
parents:
diff changeset
932 }
kono
parents:
diff changeset
933
kono
parents:
diff changeset
934 void omp_set_nested_target(
kono
parents:
diff changeset
935 TARGET_TYPE target_type,
kono
parents:
diff changeset
936 int target_number,
kono
parents:
diff changeset
937 int nested
kono
parents:
diff changeset
938 )
kono
parents:
diff changeset
939 {
kono
parents:
diff changeset
940 omp_set_int_target(target_type, target_number, nested,
kono
parents:
diff changeset
941 "omp_set_nested_target");
kono
parents:
diff changeset
942 }
kono
parents:
diff changeset
943
kono
parents:
diff changeset
944 int omp_get_nested_target(
kono
parents:
diff changeset
945 TARGET_TYPE target_type,
kono
parents:
diff changeset
946 int target_number
kono
parents:
diff changeset
947 )
kono
parents:
diff changeset
948 {
kono
parents:
diff changeset
949 return omp_get_int_target(target_type, target_number,
kono
parents:
diff changeset
950 "omp_get_nested_target");
kono
parents:
diff changeset
951 }
kono
parents:
diff changeset
952
kono
parents:
diff changeset
953 void omp_set_schedule_target(
kono
parents:
diff changeset
954 TARGET_TYPE target_type,
kono
parents:
diff changeset
955 int target_number,
kono
parents:
diff changeset
956 omp_sched_t kind,
kono
parents:
diff changeset
957 int modifier
kono
parents:
diff changeset
958 )
kono
parents:
diff changeset
959 {
kono
parents:
diff changeset
960 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
961 __func__, 0);
kono
parents:
diff changeset
962 if (ofld != 0) {
kono
parents:
diff changeset
963 VarDesc vars[2] = {0};
kono
parents:
diff changeset
964
kono
parents:
diff changeset
965 vars[0].type.src = c_data;
kono
parents:
diff changeset
966 vars[0].type.dst = c_data;
kono
parents:
diff changeset
967 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
968 vars[0].size = sizeof(omp_sched_t);
kono
parents:
diff changeset
969 vars[0].count = 1;
kono
parents:
diff changeset
970 vars[0].ptr = &kind;
kono
parents:
diff changeset
971
kono
parents:
diff changeset
972 vars[1].type.src = c_data;
kono
parents:
diff changeset
973 vars[1].type.dst = c_data;
kono
parents:
diff changeset
974 vars[1].direction.bits = c_parameter_in;
kono
parents:
diff changeset
975 vars[1].size = sizeof(int);
kono
parents:
diff changeset
976 vars[1].count = 1;
kono
parents:
diff changeset
977 vars[1].ptr = &modifier;
kono
parents:
diff changeset
978
kono
parents:
diff changeset
979 OFFLOAD_OFFLOAD(ofld, "omp_set_schedule_target",
kono
parents:
diff changeset
980 0, 2, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
981 }
kono
parents:
diff changeset
982 }
kono
parents:
diff changeset
983
kono
parents:
diff changeset
984 void omp_get_schedule_target(
kono
parents:
diff changeset
985 TARGET_TYPE target_type,
kono
parents:
diff changeset
986 int target_number,
kono
parents:
diff changeset
987 omp_sched_t *kind,
kono
parents:
diff changeset
988 int *modifier
kono
parents:
diff changeset
989 )
kono
parents:
diff changeset
990 {
kono
parents:
diff changeset
991 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
992 __func__, 0);
kono
parents:
diff changeset
993 if (ofld != 0) {
kono
parents:
diff changeset
994 VarDesc vars[2] = {0};
kono
parents:
diff changeset
995
kono
parents:
diff changeset
996 vars[0].type.src = c_data;
kono
parents:
diff changeset
997 vars[0].type.dst = c_data;
kono
parents:
diff changeset
998 vars[0].direction.bits = c_parameter_out;
kono
parents:
diff changeset
999 vars[0].size = sizeof(omp_sched_t);
kono
parents:
diff changeset
1000 vars[0].count = 1;
kono
parents:
diff changeset
1001 vars[0].ptr = kind;
kono
parents:
diff changeset
1002
kono
parents:
diff changeset
1003 vars[1].type.src = c_data;
kono
parents:
diff changeset
1004 vars[1].type.dst = c_data;
kono
parents:
diff changeset
1005 vars[1].direction.bits = c_parameter_out;
kono
parents:
diff changeset
1006 vars[1].size = sizeof(int);
kono
parents:
diff changeset
1007 vars[1].count = 1;
kono
parents:
diff changeset
1008 vars[1].ptr = modifier;
kono
parents:
diff changeset
1009
kono
parents:
diff changeset
1010 OFFLOAD_OFFLOAD(ofld, "omp_get_schedule_target",
kono
parents:
diff changeset
1011 0, 2, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1012 }
kono
parents:
diff changeset
1013 }
kono
parents:
diff changeset
1014
kono
parents:
diff changeset
1015 // lock API functions
kono
parents:
diff changeset
1016
kono
parents:
diff changeset
1017 void omp_init_lock_target(
kono
parents:
diff changeset
1018 TARGET_TYPE target_type,
kono
parents:
diff changeset
1019 int target_number,
kono
parents:
diff changeset
1020 omp_lock_target_t *lock
kono
parents:
diff changeset
1021 )
kono
parents:
diff changeset
1022 {
kono
parents:
diff changeset
1023 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1024 __func__, 0);
kono
parents:
diff changeset
1025 if (ofld != 0) {
kono
parents:
diff changeset
1026 VarDesc vars[1] = {0};
kono
parents:
diff changeset
1027
kono
parents:
diff changeset
1028 vars[0].type.src = c_data;
kono
parents:
diff changeset
1029 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1030 vars[0].direction.bits = c_parameter_out;
kono
parents:
diff changeset
1031 vars[0].size = sizeof(omp_lock_target_t);
kono
parents:
diff changeset
1032 vars[0].count = 1;
kono
parents:
diff changeset
1033 vars[0].ptr = lock;
kono
parents:
diff changeset
1034
kono
parents:
diff changeset
1035 OFFLOAD_OFFLOAD(ofld, "omp_init_lock_target",
kono
parents:
diff changeset
1036 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1037 }
kono
parents:
diff changeset
1038 }
kono
parents:
diff changeset
1039
kono
parents:
diff changeset
1040 void omp_destroy_lock_target(
kono
parents:
diff changeset
1041 TARGET_TYPE target_type,
kono
parents:
diff changeset
1042 int target_number,
kono
parents:
diff changeset
1043 omp_lock_target_t *lock
kono
parents:
diff changeset
1044 )
kono
parents:
diff changeset
1045 {
kono
parents:
diff changeset
1046 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1047 __func__, 0);
kono
parents:
diff changeset
1048 if (ofld != 0) {
kono
parents:
diff changeset
1049 VarDesc vars[1] = {0};
kono
parents:
diff changeset
1050
kono
parents:
diff changeset
1051 vars[0].type.src = c_data;
kono
parents:
diff changeset
1052 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1053 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
1054 vars[0].size = sizeof(omp_lock_target_t);
kono
parents:
diff changeset
1055 vars[0].count = 1;
kono
parents:
diff changeset
1056 vars[0].ptr = lock;
kono
parents:
diff changeset
1057
kono
parents:
diff changeset
1058 OFFLOAD_OFFLOAD(ofld, "omp_destroy_lock_target",
kono
parents:
diff changeset
1059 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1060 }
kono
parents:
diff changeset
1061 }
kono
parents:
diff changeset
1062
kono
parents:
diff changeset
1063 void omp_set_lock_target(
kono
parents:
diff changeset
1064 TARGET_TYPE target_type,
kono
parents:
diff changeset
1065 int target_number,
kono
parents:
diff changeset
1066 omp_lock_target_t *lock
kono
parents:
diff changeset
1067 )
kono
parents:
diff changeset
1068 {
kono
parents:
diff changeset
1069 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1070 __func__, 0);
kono
parents:
diff changeset
1071 if (ofld != 0) {
kono
parents:
diff changeset
1072 VarDesc vars[1] = {0};
kono
parents:
diff changeset
1073
kono
parents:
diff changeset
1074 vars[0].type.src = c_data;
kono
parents:
diff changeset
1075 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1076 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
1077 vars[0].size = sizeof(omp_lock_target_t);
kono
parents:
diff changeset
1078 vars[0].count = 1;
kono
parents:
diff changeset
1079 vars[0].ptr = lock;
kono
parents:
diff changeset
1080
kono
parents:
diff changeset
1081 OFFLOAD_OFFLOAD(ofld, "omp_set_lock_target",
kono
parents:
diff changeset
1082 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1083 }
kono
parents:
diff changeset
1084 }
kono
parents:
diff changeset
1085
kono
parents:
diff changeset
1086 void omp_unset_lock_target(
kono
parents:
diff changeset
1087 TARGET_TYPE target_type,
kono
parents:
diff changeset
1088 int target_number,
kono
parents:
diff changeset
1089 omp_lock_target_t *lock
kono
parents:
diff changeset
1090 )
kono
parents:
diff changeset
1091 {
kono
parents:
diff changeset
1092 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1093 __func__, 0);
kono
parents:
diff changeset
1094 if (ofld != 0) {
kono
parents:
diff changeset
1095 VarDesc vars[1] = {0};
kono
parents:
diff changeset
1096
kono
parents:
diff changeset
1097 vars[0].type.src = c_data;
kono
parents:
diff changeset
1098 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1099 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
1100 vars[0].size = sizeof(omp_lock_target_t);
kono
parents:
diff changeset
1101 vars[0].count = 1;
kono
parents:
diff changeset
1102 vars[0].ptr = lock;
kono
parents:
diff changeset
1103
kono
parents:
diff changeset
1104 OFFLOAD_OFFLOAD(ofld, "omp_unset_lock_target",
kono
parents:
diff changeset
1105 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1106 }
kono
parents:
diff changeset
1107 }
kono
parents:
diff changeset
1108
kono
parents:
diff changeset
1109 int omp_test_lock_target(
kono
parents:
diff changeset
1110 TARGET_TYPE target_type,
kono
parents:
diff changeset
1111 int target_number,
kono
parents:
diff changeset
1112 omp_lock_target_t *lock
kono
parents:
diff changeset
1113 )
kono
parents:
diff changeset
1114 {
kono
parents:
diff changeset
1115 int result = 0;
kono
parents:
diff changeset
1116
kono
parents:
diff changeset
1117 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1118 __func__, 0);
kono
parents:
diff changeset
1119 if (ofld != 0) {
kono
parents:
diff changeset
1120 VarDesc vars[2] = {0};
kono
parents:
diff changeset
1121
kono
parents:
diff changeset
1122 vars[0].type.src = c_data;
kono
parents:
diff changeset
1123 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1124 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
1125 vars[0].size = sizeof(omp_lock_target_t);
kono
parents:
diff changeset
1126 vars[0].count = 1;
kono
parents:
diff changeset
1127 vars[0].ptr = lock;
kono
parents:
diff changeset
1128
kono
parents:
diff changeset
1129 vars[1].type.src = c_data;
kono
parents:
diff changeset
1130 vars[1].type.dst = c_data;
kono
parents:
diff changeset
1131 vars[1].direction.bits = c_parameter_out;
kono
parents:
diff changeset
1132 vars[1].size = sizeof(int);
kono
parents:
diff changeset
1133 vars[1].count = 1;
kono
parents:
diff changeset
1134 vars[1].ptr = &result;
kono
parents:
diff changeset
1135
kono
parents:
diff changeset
1136 OFFLOAD_OFFLOAD(ofld, "omp_test_lock_target",
kono
parents:
diff changeset
1137 0, 2, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1138 }
kono
parents:
diff changeset
1139 return result;
kono
parents:
diff changeset
1140 }
kono
parents:
diff changeset
1141
kono
parents:
diff changeset
1142 // nested lock API functions
kono
parents:
diff changeset
1143
kono
parents:
diff changeset
1144 void omp_init_nest_lock_target(
kono
parents:
diff changeset
1145 TARGET_TYPE target_type,
kono
parents:
diff changeset
1146 int target_number,
kono
parents:
diff changeset
1147 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
1148 )
kono
parents:
diff changeset
1149 {
kono
parents:
diff changeset
1150 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1151 __func__, 0);
kono
parents:
diff changeset
1152 if (ofld != 0) {
kono
parents:
diff changeset
1153 VarDesc vars[1] = {0};
kono
parents:
diff changeset
1154
kono
parents:
diff changeset
1155 vars[0].type.src = c_data;
kono
parents:
diff changeset
1156 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1157 vars[0].direction.bits = c_parameter_out;
kono
parents:
diff changeset
1158 vars[0].size = sizeof(omp_nest_lock_target_t);
kono
parents:
diff changeset
1159 vars[0].count = 1;
kono
parents:
diff changeset
1160 vars[0].ptr = lock;
kono
parents:
diff changeset
1161
kono
parents:
diff changeset
1162 OFFLOAD_OFFLOAD(ofld, "omp_init_nest_lock_target",
kono
parents:
diff changeset
1163 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1164 }
kono
parents:
diff changeset
1165 }
kono
parents:
diff changeset
1166
kono
parents:
diff changeset
1167 void omp_destroy_nest_lock_target(
kono
parents:
diff changeset
1168 TARGET_TYPE target_type,
kono
parents:
diff changeset
1169 int target_number,
kono
parents:
diff changeset
1170 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
1171 )
kono
parents:
diff changeset
1172 {
kono
parents:
diff changeset
1173 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1174 __func__, 0);
kono
parents:
diff changeset
1175 if (ofld != 0) {
kono
parents:
diff changeset
1176 VarDesc vars[1] = {0};
kono
parents:
diff changeset
1177
kono
parents:
diff changeset
1178 vars[0].type.src = c_data;
kono
parents:
diff changeset
1179 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1180 vars[0].direction.bits = c_parameter_in;
kono
parents:
diff changeset
1181 vars[0].size = sizeof(omp_nest_lock_target_t);
kono
parents:
diff changeset
1182 vars[0].count = 1;
kono
parents:
diff changeset
1183 vars[0].ptr = lock;
kono
parents:
diff changeset
1184
kono
parents:
diff changeset
1185 OFFLOAD_OFFLOAD(ofld, "omp_destroy_nest_lock_target",
kono
parents:
diff changeset
1186 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1187 }
kono
parents:
diff changeset
1188 }
kono
parents:
diff changeset
1189
kono
parents:
diff changeset
1190 void omp_set_nest_lock_target(
kono
parents:
diff changeset
1191 TARGET_TYPE target_type,
kono
parents:
diff changeset
1192 int target_number,
kono
parents:
diff changeset
1193 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
1194 )
kono
parents:
diff changeset
1195 {
kono
parents:
diff changeset
1196 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1197 __func__, 0);
kono
parents:
diff changeset
1198 if (ofld != 0) {
kono
parents:
diff changeset
1199 VarDesc vars[1] = {0};
kono
parents:
diff changeset
1200
kono
parents:
diff changeset
1201 vars[0].type.src = c_data;
kono
parents:
diff changeset
1202 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1203 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
1204 vars[0].size = sizeof(omp_nest_lock_target_t);
kono
parents:
diff changeset
1205 vars[0].count = 1;
kono
parents:
diff changeset
1206 vars[0].ptr = lock;
kono
parents:
diff changeset
1207
kono
parents:
diff changeset
1208 OFFLOAD_OFFLOAD(ofld, "omp_set_nest_lock_target",
kono
parents:
diff changeset
1209 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1210 }
kono
parents:
diff changeset
1211 }
kono
parents:
diff changeset
1212
kono
parents:
diff changeset
1213 void omp_unset_nest_lock_target(
kono
parents:
diff changeset
1214 TARGET_TYPE target_type,
kono
parents:
diff changeset
1215 int target_number,
kono
parents:
diff changeset
1216 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
1217 )
kono
parents:
diff changeset
1218 {
kono
parents:
diff changeset
1219 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1220 __func__, 0);
kono
parents:
diff changeset
1221 if (ofld != 0) {
kono
parents:
diff changeset
1222 VarDesc vars[1] = {0};
kono
parents:
diff changeset
1223
kono
parents:
diff changeset
1224 vars[0].type.src = c_data;
kono
parents:
diff changeset
1225 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1226 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
1227 vars[0].size = sizeof(omp_nest_lock_target_t);
kono
parents:
diff changeset
1228 vars[0].count = 1;
kono
parents:
diff changeset
1229 vars[0].ptr = lock;
kono
parents:
diff changeset
1230
kono
parents:
diff changeset
1231 OFFLOAD_OFFLOAD(ofld, "omp_unset_nest_lock_target",
kono
parents:
diff changeset
1232 0, 1, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1233 }
kono
parents:
diff changeset
1234 }
kono
parents:
diff changeset
1235
kono
parents:
diff changeset
1236 int omp_test_nest_lock_target(
kono
parents:
diff changeset
1237 TARGET_TYPE target_type,
kono
parents:
diff changeset
1238 int target_number,
kono
parents:
diff changeset
1239 omp_nest_lock_target_t *lock
kono
parents:
diff changeset
1240 )
kono
parents:
diff changeset
1241 {
kono
parents:
diff changeset
1242 int result = 0;
kono
parents:
diff changeset
1243
kono
parents:
diff changeset
1244 OFFLOAD ofld = OFFLOAD_TARGET_ACQUIRE(target_type, target_number, 0, NULL,
kono
parents:
diff changeset
1245 __func__, 0);
kono
parents:
diff changeset
1246 if (ofld != 0) {
kono
parents:
diff changeset
1247 VarDesc vars[2] = {0};
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249 vars[0].type.src = c_data;
kono
parents:
diff changeset
1250 vars[0].type.dst = c_data;
kono
parents:
diff changeset
1251 vars[0].direction.bits = c_parameter_inout;
kono
parents:
diff changeset
1252 vars[0].size = sizeof(omp_nest_lock_target_t);
kono
parents:
diff changeset
1253 vars[0].count = 1;
kono
parents:
diff changeset
1254 vars[0].ptr = lock;
kono
parents:
diff changeset
1255
kono
parents:
diff changeset
1256 vars[1].type.src = c_data;
kono
parents:
diff changeset
1257 vars[1].type.dst = c_data;
kono
parents:
diff changeset
1258 vars[1].direction.bits = c_parameter_out;
kono
parents:
diff changeset
1259 vars[1].size = sizeof(int);
kono
parents:
diff changeset
1260 vars[1].count = 1;
kono
parents:
diff changeset
1261 vars[1].ptr = &result;
kono
parents:
diff changeset
1262
kono
parents:
diff changeset
1263 OFFLOAD_OFFLOAD(ofld, "omp_test_nest_lock_target",
kono
parents:
diff changeset
1264 0, 2, vars, NULL, 0, 0, 0);
kono
parents:
diff changeset
1265 }
kono
parents:
diff changeset
1266 return result;
kono
parents:
diff changeset
1267 }