annotate liboffloadmic/runtime/offload_host.h @ 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 /*! \file
kono
parents:
diff changeset
32 \brief The parts of the runtime library used only on the host
kono
parents:
diff changeset
33 */
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 #ifndef OFFLOAD_HOST_H_INCLUDED
kono
parents:
diff changeset
36 #define OFFLOAD_HOST_H_INCLUDED
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 #ifndef TARGET_WINNT
kono
parents:
diff changeset
39 #include <unistd.h>
kono
parents:
diff changeset
40 #endif // TARGET_WINNT
kono
parents:
diff changeset
41 #include "offload_common.h"
kono
parents:
diff changeset
42 #include "offload_util.h"
kono
parents:
diff changeset
43 #include "offload_engine.h"
kono
parents:
diff changeset
44 #include "offload_env.h"
kono
parents:
diff changeset
45 #include "offload_orsl.h"
kono
parents:
diff changeset
46 #include "coi/coi_client.h"
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 // MIC engines.
kono
parents:
diff changeset
49 DLL_LOCAL extern Engine* mic_engines;
kono
parents:
diff changeset
50 DLL_LOCAL extern uint32_t mic_engines_total;
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 // DMA channel count used by COI and set via
kono
parents:
diff changeset
53 // OFFLOAD_DMA_CHANNEL_COUNT environment variable
kono
parents:
diff changeset
54 DLL_LOCAL extern uint32_t mic_dma_channel_count;
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 //! The target image is packed as follows.
kono
parents:
diff changeset
57 /*! 1. 8 bytes containing the size of the target binary */
kono
parents:
diff changeset
58 /*! 2. a null-terminated string which is the binary name */
kono
parents:
diff changeset
59 /*! 3. <size> number of bytes that are the contents of the image */
kono
parents:
diff changeset
60 /*! The address of symbol __offload_target_image
kono
parents:
diff changeset
61 is the address of this structure. */
kono
parents:
diff changeset
62 struct Image {
kono
parents:
diff changeset
63 int64_t size; //!< Size in bytes of the target binary name and contents
kono
parents:
diff changeset
64 char data[]; //!< The name and contents of the target image
kono
parents:
diff changeset
65 };
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 // The offload descriptor.
kono
parents:
diff changeset
68 class OffloadDescriptor
kono
parents:
diff changeset
69 {
kono
parents:
diff changeset
70 public:
kono
parents:
diff changeset
71 enum OmpAsyncLastEventType {
kono
parents:
diff changeset
72 c_last_not, // not last event
kono
parents:
diff changeset
73 c_last_write, // the last event that is write
kono
parents:
diff changeset
74 c_last_read, // the last event that is read
kono
parents:
diff changeset
75 c_last_runfunc // the last event that is runfunction
kono
parents:
diff changeset
76 };
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 OffloadDescriptor(
kono
parents:
diff changeset
79 int index,
kono
parents:
diff changeset
80 _Offload_status *status,
kono
parents:
diff changeset
81 bool is_mandatory,
kono
parents:
diff changeset
82 bool is_openmp,
kono
parents:
diff changeset
83 OffloadHostTimerData * timer_data
kono
parents:
diff changeset
84 ) :
kono
parents:
diff changeset
85 m_device(mic_engines[index == -1 ? 0 : index % mic_engines_total]),
kono
parents:
diff changeset
86 m_is_mandatory(is_mandatory),
kono
parents:
diff changeset
87 m_is_openmp(is_openmp),
kono
parents:
diff changeset
88 m_inout_buf(0),
kono
parents:
diff changeset
89 m_func_desc(0),
kono
parents:
diff changeset
90 m_func_desc_size(0),
kono
parents:
diff changeset
91 m_num_in_dependencies(0),
kono
parents:
diff changeset
92 m_p_in_dependencies(0),
kono
parents:
diff changeset
93 m_in_deps(0),
kono
parents:
diff changeset
94 m_in_deps_total(0),
kono
parents:
diff changeset
95 m_in_deps_allocated(0),
kono
parents:
diff changeset
96 m_out_deps(0),
kono
parents:
diff changeset
97 m_out_deps_total(0),
kono
parents:
diff changeset
98 m_out_deps_allocated(0),
kono
parents:
diff changeset
99 m_vars(0),
kono
parents:
diff changeset
100 m_vars_extra(0),
kono
parents:
diff changeset
101 m_status(status),
kono
parents:
diff changeset
102 m_timer_data(timer_data),
kono
parents:
diff changeset
103 m_out_with_preallocated(false),
kono
parents:
diff changeset
104 m_preallocated_alloc(false),
kono
parents:
diff changeset
105 m_traceback_called(false),
kono
parents:
diff changeset
106 m_stream(-1),
kono
parents:
diff changeset
107 m_signal(0),
kono
parents:
diff changeset
108 m_has_signal(0),
kono
parents:
diff changeset
109 m_omp_async_last_event_type(c_last_not)
kono
parents:
diff changeset
110 {
kono
parents:
diff changeset
111 m_wait_all_devices = index == -1;
kono
parents:
diff changeset
112 }
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 ~OffloadDescriptor()
kono
parents:
diff changeset
115 {
kono
parents:
diff changeset
116 if (m_in_deps != 0) {
kono
parents:
diff changeset
117 free(m_in_deps);
kono
parents:
diff changeset
118 }
kono
parents:
diff changeset
119 if (m_out_deps != 0) {
kono
parents:
diff changeset
120 free(m_out_deps);
kono
parents:
diff changeset
121 }
kono
parents:
diff changeset
122 if (m_func_desc != 0) {
kono
parents:
diff changeset
123 free(m_func_desc);
kono
parents:
diff changeset
124 }
kono
parents:
diff changeset
125 if (m_vars != 0) {
kono
parents:
diff changeset
126 free(m_vars);
kono
parents:
diff changeset
127 free(m_vars_extra);
kono
parents:
diff changeset
128 }
kono
parents:
diff changeset
129 }
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 bool offload(const char *name, bool is_empty,
kono
parents:
diff changeset
132 VarDesc *vars, VarDesc2 *vars2, int vars_total,
kono
parents:
diff changeset
133 const void **waits, int num_waits, const void **signal,
kono
parents:
diff changeset
134 int entry_id, const void *stack_addr,
kono
parents:
diff changeset
135 OffloadFlags offload_flags);
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 bool offload_finish(bool is_traceback);
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 bool is_signaled();
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 OffloadHostTimerData* get_timer_data() const {
kono
parents:
diff changeset
142 return m_timer_data;
kono
parents:
diff changeset
143 }
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 void set_stream(_Offload_stream stream) {
kono
parents:
diff changeset
146 m_stream = stream;
kono
parents:
diff changeset
147 }
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 _Offload_stream get_stream() {
kono
parents:
diff changeset
150 return(m_stream);
kono
parents:
diff changeset
151 }
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 Engine& get_device() {
kono
parents:
diff changeset
154 return m_device;
kono
parents:
diff changeset
155 }
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 void* get_signal() {
kono
parents:
diff changeset
158 return(m_signal);
kono
parents:
diff changeset
159 }
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 void set_signal(const void* signal) {
kono
parents:
diff changeset
162 m_has_signal = 1;
kono
parents:
diff changeset
163 m_signal = const_cast<void*>(signal);
kono
parents:
diff changeset
164 }
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 void cleanup();
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 uint32_t m_event_count;
kono
parents:
diff changeset
169 bool m_has_signal;
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 private:
kono
parents:
diff changeset
172 bool offload_wrap(const char *name, bool is_empty,
kono
parents:
diff changeset
173 VarDesc *vars, VarDesc2 *vars2, int vars_total,
kono
parents:
diff changeset
174 const void **waits, int num_waits, const void **signal,
kono
parents:
diff changeset
175 int entry_id, const void *stack_addr,
kono
parents:
diff changeset
176 OffloadFlags offload_flags);
kono
parents:
diff changeset
177 bool wait_dependencies(const void **waits, int num_waits,
kono
parents:
diff changeset
178 _Offload_stream stream);
kono
parents:
diff changeset
179 bool setup_descriptors(VarDesc *vars, VarDesc2 *vars2, int vars_total,
kono
parents:
diff changeset
180 int entry_id, const void *stack_addr);
kono
parents:
diff changeset
181 bool setup_misc_data(const char *name);
kono
parents:
diff changeset
182 bool send_pointer_data(bool is_async, void* info);
kono
parents:
diff changeset
183 bool send_noncontiguous_pointer_data(
kono
parents:
diff changeset
184 int i,
kono
parents:
diff changeset
185 PtrData* src_buf,
kono
parents:
diff changeset
186 PtrData* dst_buf,
kono
parents:
diff changeset
187 COIEVENT *event,
kono
parents:
diff changeset
188 uint64_t &sent_data,
kono
parents:
diff changeset
189 uint32_t in_deps_amount,
kono
parents:
diff changeset
190 COIEVENT *in_deps
kono
parents:
diff changeset
191 );
kono
parents:
diff changeset
192 bool receive_noncontiguous_pointer_data(
kono
parents:
diff changeset
193 int i,
kono
parents:
diff changeset
194 COIBUFFER dst_buf,
kono
parents:
diff changeset
195 COIEVENT *event,
kono
parents:
diff changeset
196 uint64_t &received_data,
kono
parents:
diff changeset
197 uint32_t in_deps_amount,
kono
parents:
diff changeset
198 COIEVENT *in_deps
kono
parents:
diff changeset
199 );
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 bool gather_copyin_data();
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 bool compute(void *);
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 bool receive_pointer_data(bool is_async, bool first_run, void * info);
kono
parents:
diff changeset
206 bool scatter_copyout_data();
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 bool find_ptr_data(PtrData* &ptr_data, void *base, int64_t disp,
kono
parents:
diff changeset
209 int64_t length, bool is_targptr,
kono
parents:
diff changeset
210 bool error_does_not_exist = true);
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 void find_device_ptr( int64_t* &device_ptr,
kono
parents:
diff changeset
213 void *host_ptr);
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 bool alloc_ptr_data(PtrData* &ptr_data, void *base, int64_t disp,
kono
parents:
diff changeset
216 int64_t length, int64_t alloc_disp, int align,
kono
parents:
diff changeset
217 bool is_targptr, bool is_prealloc, bool pin);
kono
parents:
diff changeset
218 bool create_preallocated_buffer(PtrData* ptr_data, void *base);
kono
parents:
diff changeset
219 bool init_static_ptr_data(PtrData *ptr_data);
kono
parents:
diff changeset
220 bool init_mic_address(PtrData *ptr_data);
kono
parents:
diff changeset
221 bool offload_stack_memory_manager(
kono
parents:
diff changeset
222 const void * stack_begin,
kono
parents:
diff changeset
223 int routine_id,
kono
parents:
diff changeset
224 int buf_size,
kono
parents:
diff changeset
225 int align,
kono
parents:
diff changeset
226 bool thread_specific_function_locals,
kono
parents:
diff changeset
227 bool *is_new);
kono
parents:
diff changeset
228 char *get_this_threads_cpu_stack_addr(
kono
parents:
diff changeset
229 const void * stack_begin,
kono
parents:
diff changeset
230 int routine_id,
kono
parents:
diff changeset
231 bool thread_specific_function_locals);
kono
parents:
diff changeset
232 PtrData *get_this_threads_mic_stack_addr(
kono
parents:
diff changeset
233 const void * stack_begin,
kono
parents:
diff changeset
234 int routine_id,
kono
parents:
diff changeset
235 bool thread_specific_function_locals);
kono
parents:
diff changeset
236 bool nullify_target_stack(COIBUFFER targ_buf, uint64_t size);
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 bool gen_var_descs_for_pointer_array(int i);
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 void get_stream_in_dependencies(uint32_t &in_deps_amount,
kono
parents:
diff changeset
241 COIEVENT* &in_deps);
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 void report_coi_error(error_types msg, COIRESULT res);
kono
parents:
diff changeset
244 _Offload_result translate_coi_error(COIRESULT res) const;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 void setup_omp_async_info();
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 void setup_use_device_ptr(int i);
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 void register_event_call_back(void (*)(
kono
parents:
diff changeset
251 COIEVENT,
kono
parents:
diff changeset
252 const COIRESULT,
kono
parents:
diff changeset
253 const void*),
kono
parents:
diff changeset
254 const COIEVENT *event,
kono
parents:
diff changeset
255 const void *info);
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 void register_omp_event_call_back(const COIEVENT *event, const void *info);
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 private:
kono
parents:
diff changeset
260 typedef std::list<COIBUFFER> BufferList;
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 // extra data associated with each variable descriptor
kono
parents:
diff changeset
263 struct VarExtra {
kono
parents:
diff changeset
264 PtrData* src_data;
kono
parents:
diff changeset
265 PtrData* dst_data;
kono
parents:
diff changeset
266 AutoData* auto_data;
kono
parents:
diff changeset
267 int64_t cpu_disp;
kono
parents:
diff changeset
268 int64_t cpu_offset;
kono
parents:
diff changeset
269 void *alloc;
kono
parents:
diff changeset
270 union {
kono
parents:
diff changeset
271 CeanReadRanges *read_rng_src;
kono
parents:
diff changeset
272 NonContigDesc *noncont_desc;
kono
parents:
diff changeset
273 };
kono
parents:
diff changeset
274 CeanReadRanges *read_rng_dst;
kono
parents:
diff changeset
275 int64_t ptr_arr_offset;
kono
parents:
diff changeset
276 bool is_arr_ptr_el;
kono
parents:
diff changeset
277 OmpAsyncLastEventType omp_last_event_type;
kono
parents:
diff changeset
278 int64_t pointer_offset;
kono
parents:
diff changeset
279 uint16_t type_src;
kono
parents:
diff changeset
280 uint16_t type_dst;
kono
parents:
diff changeset
281 };
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 template<typename T> class ReadArrElements {
kono
parents:
diff changeset
284 public:
kono
parents:
diff changeset
285 ReadArrElements():
kono
parents:
diff changeset
286 ranges(NULL),
kono
parents:
diff changeset
287 el_size(sizeof(T)),
kono
parents:
diff changeset
288 offset(0),
kono
parents:
diff changeset
289 count(0),
kono
parents:
diff changeset
290 is_empty(true),
kono
parents:
diff changeset
291 base(NULL)
kono
parents:
diff changeset
292 {}
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 bool read_next(bool flag)
kono
parents:
diff changeset
295 {
kono
parents:
diff changeset
296 if (flag != 0) {
kono
parents:
diff changeset
297 if (is_empty) {
kono
parents:
diff changeset
298 if (ranges) {
kono
parents:
diff changeset
299 if (!get_next_range(ranges, &offset)) {
kono
parents:
diff changeset
300 // ranges are over
kono
parents:
diff changeset
301 return false;
kono
parents:
diff changeset
302 }
kono
parents:
diff changeset
303 }
kono
parents:
diff changeset
304 // all contiguous elements are over
kono
parents:
diff changeset
305 else if (count != 0) {
kono
parents:
diff changeset
306 return false;
kono
parents:
diff changeset
307 }
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 length_cur = size;
kono
parents:
diff changeset
310 }
kono
parents:
diff changeset
311 else {
kono
parents:
diff changeset
312 offset += el_size;
kono
parents:
diff changeset
313 }
kono
parents:
diff changeset
314 val = (T)get_el_value(base, offset, el_size);
kono
parents:
diff changeset
315 length_cur -= el_size;
kono
parents:
diff changeset
316 count++;
kono
parents:
diff changeset
317 is_empty = length_cur == 0;
kono
parents:
diff changeset
318 }
kono
parents:
diff changeset
319 return true;
kono
parents:
diff changeset
320 }
kono
parents:
diff changeset
321 public:
kono
parents:
diff changeset
322 CeanReadRanges * ranges;
kono
parents:
diff changeset
323 T val;
kono
parents:
diff changeset
324 int el_size;
kono
parents:
diff changeset
325 int64_t size,
kono
parents:
diff changeset
326 offset,
kono
parents:
diff changeset
327 length_cur;
kono
parents:
diff changeset
328 bool is_empty;
kono
parents:
diff changeset
329 int count;
kono
parents:
diff changeset
330 char *base;
kono
parents:
diff changeset
331 };
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 // ptr_data for persistent auto objects
kono
parents:
diff changeset
334 PtrData* m_stack_ptr_data;
kono
parents:
diff changeset
335 PtrDataList m_destroy_stack;
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 // Engine
kono
parents:
diff changeset
338 Engine& m_device;
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 // true for offload_wait target(mic) stream(0)
kono
parents:
diff changeset
341 bool m_wait_all_devices;
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 // if true offload is mandatory
kono
parents:
diff changeset
344 bool m_is_mandatory;
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 // if true offload has openmp origin
kono
parents:
diff changeset
347 const bool m_is_openmp;
kono
parents:
diff changeset
348
kono
parents:
diff changeset
349 // The Marshaller for the inputs of the offloaded region.
kono
parents:
diff changeset
350 Marshaller m_in;
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 // The Marshaller for the outputs of the offloaded region.
kono
parents:
diff changeset
353 Marshaller m_out;
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 // List of buffers that are passed to dispatch call
kono
parents:
diff changeset
356 BufferList m_compute_buffers;
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 // List of buffers that need to be destroyed at the end of offload
kono
parents:
diff changeset
359 BufferList m_destroy_buffers;
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 // Variable descriptors
kono
parents:
diff changeset
362 VarDesc* m_vars;
kono
parents:
diff changeset
363 VarExtra* m_vars_extra;
kono
parents:
diff changeset
364 int m_vars_total;
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 // Pointer to a user-specified status variable
kono
parents:
diff changeset
367 _Offload_status *m_status;
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 // Function descriptor
kono
parents:
diff changeset
370 FunctionDescriptor* m_func_desc;
kono
parents:
diff changeset
371 uint32_t m_func_desc_size;
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 // Buffer for transferring copyin/copyout data
kono
parents:
diff changeset
374 COIBUFFER m_inout_buf;
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 // Dependencies
kono
parents:
diff changeset
378 COIEVENT *m_in_deps;
kono
parents:
diff changeset
379 uint32_t m_in_deps_total;
kono
parents:
diff changeset
380 uint32_t m_in_deps_allocated;
kono
parents:
diff changeset
381 COIEVENT *m_out_deps;
kono
parents:
diff changeset
382 uint32_t m_out_deps_total;
kono
parents:
diff changeset
383 uint32_t m_out_deps_allocated;
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 // 2 variables defines input dependencies for current COI API.
kono
parents:
diff changeset
386 // The calls to routines as BufferWrite/PipelineRunFunction/BufferRead
kono
parents:
diff changeset
387 // is supposed to have input dependencies.
kono
parents:
diff changeset
388 // 2 variables below defines the number and vector of dependencies
kono
parents:
diff changeset
389 // in every current moment of offload.
kono
parents:
diff changeset
390 // So any phase of offload can use its values as input dependencies
kono
parents:
diff changeset
391 // for the COI API that the phase calls.
kono
parents:
diff changeset
392 // It means that all phases (of Write, RunFunction,Read) must keep
kono
parents:
diff changeset
393 // the variables correct to be used by following phase.
kono
parents:
diff changeset
394 // If some consequent offloads are connected (i.e. by the same stream)
kono
parents:
diff changeset
395 // the final 2 variables of the offload is used as initial inputs
kono
parents:
diff changeset
396 // for the next offload.
kono
parents:
diff changeset
397 uint32_t m_num_in_dependencies;
kono
parents:
diff changeset
398 COIEVENT *m_p_in_dependencies;
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 // Stream
kono
parents:
diff changeset
401 _Offload_stream m_stream;
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 // Signal
kono
parents:
diff changeset
404 void* m_signal;
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 // Timer data
kono
parents:
diff changeset
407 OffloadHostTimerData *m_timer_data;
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 // copyin/copyout data length
kono
parents:
diff changeset
410 uint64_t m_in_datalen;
kono
parents:
diff changeset
411 uint64_t m_out_datalen;
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 // a boolean value calculated in setup_descriptors. If true we need to do
kono
parents:
diff changeset
414 // a run function on the target. Otherwise it may be optimized away.
kono
parents:
diff changeset
415 bool m_need_runfunction;
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 // initialized value of m_need_runfunction;
kono
parents:
diff changeset
418 // is used to recognize offload_transfer
kono
parents:
diff changeset
419 bool m_initial_need_runfunction;
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 // a Boolean value set to true when OUT clauses with preallocated targetptr
kono
parents:
diff changeset
422 // is encountered to indicate that call receive_pointer_data needs to be
kono
parents:
diff changeset
423 // invoked again after call to scatter_copyout_data.
kono
parents:
diff changeset
424 bool m_out_with_preallocated;
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 // a Boolean value set to true if an alloc_if(1) is used with preallocated
kono
parents:
diff changeset
427 // targetptr to indicate the need to scatter_copyout_data even for
kono
parents:
diff changeset
428 // async offload
kono
parents:
diff changeset
429 bool m_preallocated_alloc;
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 // a Boolean value set to true if traceback routine is called
kono
parents:
diff changeset
432 bool m_traceback_called;
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 OmpAsyncLastEventType m_omp_async_last_event_type;
kono
parents:
diff changeset
435 };
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 // Initialization types for MIC
kono
parents:
diff changeset
438 enum OffloadInitType {
kono
parents:
diff changeset
439 c_init_on_start, // all devices before entering main
kono
parents:
diff changeset
440 c_init_on_offload, // single device before starting the first offload
kono
parents:
diff changeset
441 c_init_on_offload_all // all devices before starting the first offload
kono
parents:
diff changeset
442 };
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 // Determines if MIC code is an executable or a shared library
kono
parents:
diff changeset
445 extern "C" bool __offload_target_image_is_executable(const void *target_image);
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 // Initializes library and registers specified offload image.
kono
parents:
diff changeset
448 extern "C" bool __offload_register_image(const void* image);
kono
parents:
diff changeset
449 extern "C" void __offload_unregister_image(const void* image);
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 // Registers asynchronous task completion callback
kono
parents:
diff changeset
452 extern "C" void __offload_register_task_callback(void (*cb)(void *));
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 // Initializes offload runtime library.
kono
parents:
diff changeset
455 DLL_LOCAL extern int __offload_init_library(void);
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 // thread data for associating pipelines with threads
kono
parents:
diff changeset
458 DLL_LOCAL extern pthread_key_t mic_thread_key;
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 // location of offload_main executable
kono
parents:
diff changeset
461 // To be used if the main application has no offload and is not built
kono
parents:
diff changeset
462 // with -offload but dynamic library linked in has offload pragma
kono
parents:
diff changeset
463 DLL_LOCAL extern char* mic_device_main;
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 // Environment variables for devices
kono
parents:
diff changeset
466 DLL_LOCAL extern MicEnvVar mic_env_vars;
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 // CPU frequency
kono
parents:
diff changeset
469 DLL_LOCAL extern uint64_t cpu_frequency;
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 // LD_LIBRARY_PATH for KNC libraries
kono
parents:
diff changeset
472 DLL_LOCAL extern char* knc_library_path;
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 // LD_LIBRARY_PATH for KNL libraries
kono
parents:
diff changeset
475 DLL_LOCAL extern char* knl_library_path;
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 // stack size for target
kono
parents:
diff changeset
478 DLL_LOCAL extern uint32_t mic_stack_size;
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 // Preallocated memory size for buffers on MIC
kono
parents:
diff changeset
481 DLL_LOCAL extern uint64_t mic_buffer_size;
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 // Preallocated 4K page memory size for buffers on MIC
kono
parents:
diff changeset
484 DLL_LOCAL extern uint64_t mic_4k_buffer_size;
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 // Preallocated 2M page memory size for buffers on MIC
kono
parents:
diff changeset
487 DLL_LOCAL extern uint64_t mic_2m_buffer_size;
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 // Setting controlling inout proxy
kono
parents:
diff changeset
490 DLL_LOCAL extern bool mic_proxy_io;
kono
parents:
diff changeset
491 DLL_LOCAL extern char* mic_proxy_fs_root;
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 // Threshold for creating buffers with large pages
kono
parents:
diff changeset
494 DLL_LOCAL extern uint64_t __offload_use_2mb_buffers;
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 // offload initialization type
kono
parents:
diff changeset
497 DLL_LOCAL extern OffloadInitType __offload_init_type;
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 // Device number to offload to when device is not explicitly specified.
kono
parents:
diff changeset
500 DLL_LOCAL extern int __omp_device_num;
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 // target executable
kono
parents:
diff changeset
503 DLL_LOCAL extern TargetImage* __target_exe;
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 // is true if last loaded image is dll
kono
parents:
diff changeset
506 DLL_LOCAL extern bool __current_image_is_dll;
kono
parents:
diff changeset
507 // is true if myo library is loaded when dll is loaded
kono
parents:
diff changeset
508 DLL_LOCAL extern bool __myo_init_in_so;
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 // IDB support
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 // Called by the offload runtime after initialization of offload infrastructure
kono
parents:
diff changeset
513 // has been completed.
kono
parents:
diff changeset
514 extern "C" void __dbg_target_so_loaded();
kono
parents:
diff changeset
515
kono
parents:
diff changeset
516 // Called by the offload runtime when the offload infrastructure is about to be
kono
parents:
diff changeset
517 // shut down, currently at application exit.
kono
parents:
diff changeset
518 extern "C" void __dbg_target_so_unloaded();
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 // Null-terminated string containing path to the process image of the hosting
kono
parents:
diff changeset
521 // application (offload_main)
kono
parents:
diff changeset
522 #define MAX_TARGET_NAME 512
kono
parents:
diff changeset
523 extern "C" char __dbg_target_exe_name[MAX_TARGET_NAME];
kono
parents:
diff changeset
524
kono
parents:
diff changeset
525 // Integer specifying the process id
kono
parents:
diff changeset
526 extern "C" pid_t __dbg_target_so_pid;
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 // Integer specifying the 0-based device number
kono
parents:
diff changeset
529 extern "C" int __dbg_target_id;
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 // Set to non-zero by the host-side debugger to enable offload debugging
kono
parents:
diff changeset
532 // support
kono
parents:
diff changeset
533 extern "C" int __dbg_is_attached;
kono
parents:
diff changeset
534
kono
parents:
diff changeset
535 // Major version of the debugger support API
kono
parents:
diff changeset
536 extern "C" const int __dbg_api_major_version;
kono
parents:
diff changeset
537
kono
parents:
diff changeset
538 // Minor version of the debugger support API
kono
parents:
diff changeset
539 extern "C" const int __dbg_api_minor_version;
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 #endif // OFFLOAD_HOST_H_INCLUDED