aboutsummaryrefslogtreecommitdiff
path: root/liboffloadmic/runtime/offload_host.h
diff options
context:
space:
mode:
Diffstat (limited to 'liboffloadmic/runtime/offload_host.h')
-rw-r--r--liboffloadmic/runtime/offload_host.h363
1 files changed, 363 insertions, 0 deletions
diff --git a/liboffloadmic/runtime/offload_host.h b/liboffloadmic/runtime/offload_host.h
new file mode 100644
index 00000000000..2212dec5149
--- /dev/null
+++ b/liboffloadmic/runtime/offload_host.h
@@ -0,0 +1,363 @@
+/*
+ Copyright (c) 2014 Intel Corporation. All Rights Reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+/*! \file
+ \brief The parts of the runtime library used only on the host
+*/
+
+#ifndef OFFLOAD_HOST_H_INCLUDED
+#define OFFLOAD_HOST_H_INCLUDED
+
+#ifndef TARGET_WINNT
+#include <unistd.h>
+#endif // TARGET_WINNT
+#include "offload_common.h"
+#include "offload_util.h"
+#include "offload_engine.h"
+#include "offload_env.h"
+#include "offload_orsl.h"
+#include "coi/coi_client.h"
+
+// MIC engines.
+extern Engine* mic_engines;
+extern uint32_t mic_engines_total;
+
+//! The target image is packed as follows.
+/*! 1. 8 bytes containing the size of the target binary */
+/*! 2. a null-terminated string which is the binary name */
+/*! 3. <size> number of bytes that are the contents of the image */
+/*! The address of symbol __offload_target_image
+ is the address of this structure. */
+struct Image {
+ int64_t size; //!< Size in bytes of the target binary name and contents
+ char data[]; //!< The name and contents of the target image
+};
+
+// The offload descriptor.
+class OffloadDescriptor
+{
+public:
+ OffloadDescriptor(
+ int index,
+ _Offload_status *status,
+ bool is_mandatory,
+ bool is_openmp,
+ OffloadHostTimerData * timer_data
+ ) :
+ m_device(mic_engines[index % mic_engines_total]),
+ m_is_mandatory(is_mandatory),
+ m_is_openmp(is_openmp),
+ m_inout_buf(0),
+ m_func_desc(0),
+ m_func_desc_size(0),
+ m_in_deps(0),
+ m_in_deps_total(0),
+ m_out_deps(0),
+ m_out_deps_total(0),
+ m_vars(0),
+ m_vars_extra(0),
+ m_status(status),
+ m_timer_data(timer_data)
+ {}
+
+ ~OffloadDescriptor()
+ {
+ if (m_in_deps != 0) {
+ free(m_in_deps);
+ }
+ if (m_out_deps != 0) {
+ free(m_out_deps);
+ }
+ if (m_func_desc != 0) {
+ free(m_func_desc);
+ }
+ if (m_vars != 0) {
+ free(m_vars);
+ free(m_vars_extra);
+ }
+ }
+
+ bool offload(const char *name, bool is_empty,
+ VarDesc *vars, VarDesc2 *vars2, int vars_total,
+ const void **waits, int num_waits, const void **signal,
+ int entry_id, const void *stack_addr);
+ bool offload_finish();
+
+ bool is_signaled();
+
+ OffloadHostTimerData* get_timer_data() const {
+ return m_timer_data;
+ }
+
+private:
+ bool wait_dependencies(const void **waits, int num_waits);
+ bool setup_descriptors(VarDesc *vars, VarDesc2 *vars2, int vars_total,
+ int entry_id, const void *stack_addr);
+ bool setup_misc_data(const char *name);
+ bool send_pointer_data(bool is_async);
+ bool send_noncontiguous_pointer_data(
+ int i,
+ PtrData* src_buf,
+ PtrData* dst_buf,
+ COIEVENT *event);
+ bool recieve_noncontiguous_pointer_data(
+ int i,
+ char* src_data,
+ COIBUFFER dst_buf,
+ COIEVENT *event);
+
+ bool gather_copyin_data();
+
+ bool compute();
+
+ bool receive_pointer_data(bool is_async);
+ bool scatter_copyout_data();
+
+ void cleanup();
+
+ bool find_ptr_data(PtrData* &ptr_data, void *base, int64_t disp,
+ int64_t length, bool error_does_not_exist = true);
+ bool alloc_ptr_data(PtrData* &ptr_data, void *base, int64_t disp,
+ int64_t length, int64_t alloc_disp, int align);
+ bool init_static_ptr_data(PtrData *ptr_data);
+ bool init_mic_address(PtrData *ptr_data);
+ bool offload_stack_memory_manager(const void * stack_begin, int routine_id,
+ int buf_size, int align, bool *is_new);
+ bool nullify_target_stack(COIBUFFER targ_buf, uint64_t size);
+
+ bool gen_var_descs_for_pointer_array(int i);
+
+ void report_coi_error(error_types msg, COIRESULT res);
+ _Offload_result translate_coi_error(COIRESULT res) const;
+
+private:
+ typedef std::list<COIBUFFER> BufferList;
+
+ // extra data associated with each variable descriptor
+ struct VarExtra {
+ PtrData* src_data;
+ PtrData* dst_data;
+ AutoData* auto_data;
+ int64_t cpu_disp;
+ int64_t cpu_offset;
+ CeanReadRanges *read_rng_src;
+ CeanReadRanges *read_rng_dst;
+ int64_t ptr_arr_offset;
+ bool is_arr_ptr_el;
+ };
+
+ template<typename T> class ReadArrElements {
+ public:
+ ReadArrElements():
+ ranges(NULL),
+ el_size(sizeof(T)),
+ offset(0),
+ count(0),
+ is_empty(true),
+ base(NULL)
+ {}
+
+ bool read_next(bool flag)
+ {
+ if (flag != 0) {
+ if (is_empty) {
+ if (ranges) {
+ if (!get_next_range(ranges, &offset)) {
+ // ranges are over
+ return false;
+ }
+ }
+ // all contiguous elements are over
+ else if (count != 0) {
+ return false;
+ }
+
+ length_cur = size;
+ }
+ else {
+ offset += el_size;
+ }
+ val = (T)get_el_value(base, offset, el_size);
+ length_cur -= el_size;
+ count++;
+ is_empty = length_cur == 0;
+ }
+ return true;
+ }
+ public:
+ CeanReadRanges * ranges;
+ T val;
+ int el_size;
+ int64_t size,
+ offset,
+ length_cur;
+ bool is_empty;
+ int count;
+ char *base;
+ };
+
+ // ptr_data for persistent auto objects
+ PtrData* m_stack_ptr_data;
+ PtrDataList m_destroy_stack;
+
+ // Engine
+ Engine& m_device;
+
+ // if true offload is mandatory
+ bool m_is_mandatory;
+
+ // if true offload has openmp origin
+ const bool m_is_openmp;
+
+ // The Marshaller for the inputs of the offloaded region.
+ Marshaller m_in;
+
+ // The Marshaller for the outputs of the offloaded region.
+ Marshaller m_out;
+
+ // List of buffers that are passed to dispatch call
+ BufferList m_compute_buffers;
+
+ // List of buffers that need to be destroyed at the end of offload
+ BufferList m_destroy_buffers;
+
+ // Variable descriptors
+ VarDesc* m_vars;
+ VarExtra* m_vars_extra;
+ int m_vars_total;
+
+ // Pointer to a user-specified status variable
+ _Offload_status *m_status;
+
+ // Function descriptor
+ FunctionDescriptor* m_func_desc;
+ uint32_t m_func_desc_size;
+
+ // Buffer for transferring copyin/copyout data
+ COIBUFFER m_inout_buf;
+
+ // Dependencies
+ COIEVENT *m_in_deps;
+ uint32_t m_in_deps_total;
+ COIEVENT *m_out_deps;
+ uint32_t m_out_deps_total;
+
+ // Timer data
+ OffloadHostTimerData *m_timer_data;
+
+ // copyin/copyout data length
+ uint64_t m_in_datalen;
+ uint64_t m_out_datalen;
+
+ // a boolean value calculated in setup_descriptors. If true we need to do
+ // a run function on the target. Otherwise it may be optimized away.
+ bool m_need_runfunction;
+};
+
+// Initialization types for MIC
+enum OffloadInitType {
+ c_init_on_start, // all devices before entering main
+ c_init_on_offload, // single device before starting the first offload
+ c_init_on_offload_all // all devices before starting the first offload
+};
+
+// Initializes library and registers specified offload image.
+extern "C" void __offload_register_image(const void* image);
+extern "C" void __offload_unregister_image(const void* image);
+
+// Initializes offload runtime library.
+extern int __offload_init_library(void);
+
+// thread data for associating pipelines with threads
+extern pthread_key_t mic_thread_key;
+
+// Environment variables for devices
+extern MicEnvVar mic_env_vars;
+
+// CPU frequency
+extern uint64_t cpu_frequency;
+
+// LD_LIBRARY_PATH for MIC libraries
+extern char* mic_library_path;
+
+// stack size for target
+extern uint32_t mic_stack_size;
+
+// Preallocated memory size for buffers on MIC
+extern uint64_t mic_buffer_size;
+
+// Setting controlling inout proxy
+extern bool mic_proxy_io;
+extern char* mic_proxy_fs_root;
+
+// Threshold for creating buffers with large pages
+extern uint64_t __offload_use_2mb_buffers;
+
+// offload initialization type
+extern OffloadInitType __offload_init_type;
+
+// Device number to offload to when device is not explicitly specified.
+extern int __omp_device_num;
+
+// target executable
+extern TargetImage* __target_exe;
+
+// IDB support
+
+// Called by the offload runtime after initialization of offload infrastructure
+// has been completed.
+extern "C" void __dbg_target_so_loaded();
+
+// Called by the offload runtime when the offload infrastructure is about to be
+// shut down, currently at application exit.
+extern "C" void __dbg_target_so_unloaded();
+
+// Null-terminated string containing path to the process image of the hosting
+// application (offload_main)
+#define MAX_TARGET_NAME 512
+extern "C" char __dbg_target_exe_name[MAX_TARGET_NAME];
+
+// Integer specifying the process id
+extern "C" pid_t __dbg_target_so_pid;
+
+// Integer specifying the 0-based device number
+extern "C" int __dbg_target_id;
+
+// Set to non-zero by the host-side debugger to enable offload debugging
+// support
+extern "C" int __dbg_is_attached;
+
+// Major version of the debugger support API
+extern "C" const int __dbg_api_major_version;
+
+// Minor version of the debugger support API
+extern "C" const int __dbg_api_minor_version;
+
+#endif // OFFLOAD_HOST_H_INCLUDED