5f52081962
* Makefile.def: Add liboffloadmic to target_modules. Make liboffloadmic depend on libgomp's configure, libstdc++ and libgcc. * Makefile.in: Regenerate. * configure: Regenerate. * configure.ac: Add liboffloadmic to target binaries. Restrict liboffloadmic for POSIX and i*86, and x86_64 architectures. Add liboffloadmic to noconfig list when C++ is not supported. config/ * target-posix: New file. libcilkrts/ * configure.tgt: Use config/target-posix. liboffloadmic/ Initial commit. Imported from upstream: https://www.openmprtl.org/sites/default/files/liboffload_oss.tgz * Makefile.am: New file. * Makefile.in: New file, generated by automake. * aclocal.m4: New file, generated by aclocal. * configure: New file, generated by autoconf. * configure.ac: New file. * configure.tgt: Ditto. * doc/doxygen/config: Ditto. * doc/doxygen/header.tex: Ditto. * include/coi/common/COIEngine_common.h: Ditto. * include/coi/common/COIMacros_common.h: Ditto. * include/coi/common/COIPerf_common.h : Ditto. * include/coi/common/COIResult_common.h : Ditto. * include/coi/common/COITypes_common.h: Ditto. * include/coi/sink/COIBuffer_sink.h: Ditto. * include/coi/sink/COIPipeline_sink.h: Ditto. * include/coi/sink/COIProcess_sink.h: Ditto. * include/coi/source/COIBuffer_source.h: Ditto. * include/coi/source/COIEngine_source.h: Ditto. * include/coi/source/COIEvent_source.h: Ditto. * include/coi/source/COIPipeline_source.h: Ditto. * include/coi/source/COIProcess_source.h: Ditto. * include/myo/myo.h: Ditto. * include/myo/myoimpl.h: Ditto. * include/myo/myotypes.h: Ditto. * liboffloadmic_host.spec.in: Ditto. * liboffloadmic_target.spec.in: Ditto. * runtime/cean_util.cpp: Ditto. * runtime/cean_util.h: Ditto. * runtime/coi/coi_client.cpp: Ditto. * runtime/coi/coi_client.h: Ditto. * runtime/coi/coi_server.cpp: Ditto. * runtime/coi/coi_server.h: Ditto. * runtime/compiler_if_host.cpp: Ditto. * runtime/compiler_if_host.h: Ditto. * runtime/compiler_if_target.cpp: Ditto. * runtime/compiler_if_target.h: Ditto. * runtime/dv_util.cpp: Ditto. * runtime/dv_util.h: Ditto. * runtime/emulator/coi_common.h: Ditto. * runtime/emulator/coi_device.cpp: Ditto. * runtime/emulator/coi_device.h: Ditto. * runtime/emulator/coi_host.cpp: Ditto. * runtime/emulator/coi_host.h: Ditto. * runtime/emulator/coi_version_asm.h: Ditto. * runtime/emulator/coi_version_linker_script.map: Ditto. * runtime/emulator/myo_client.cpp: Ditto. * runtime/emulator/myo_service.cpp: Ditto. * runtime/emulator/myo_service.h: Ditto. * runtime/emulator/myo_version_asm.h: Ditto. * runtime/emulator/myo_version_linker_script.map: Ditto. * runtime/liboffload_error.c: Ditto. * runtime/liboffload_error_codes.h: Ditto. * runtime/liboffload_msg.c: Ditto. * runtime/liboffload_msg.h: Ditto. * runtime/mic_lib.f90: Ditto. * runtime/offload.h: Ditto. * runtime/offload_common.cpp: Ditto. * runtime/offload_common.h: Ditto. * runtime/offload_engine.cpp: Ditto. * runtime/offload_engine.h: Ditto. * runtime/offload_env.cpp: Ditto. * runtime/offload_env.h: Ditto. * runtime/offload_host.cpp: Ditto. * runtime/offload_host.h: Ditto. * runtime/offload_myo_host.cpp: Ditto. * runtime/offload_myo_host.h: Ditto. * runtime/offload_myo_target.cpp: Ditto. * runtime/offload_myo_target.h: Ditto. * runtime/offload_omp_host.cpp: Ditto. * runtime/offload_omp_target.cpp: Ditto. * runtime/offload_orsl.cpp: Ditto. * runtime/offload_orsl.h: Ditto. * runtime/offload_table.cpp: Ditto. * runtime/offload_table.h: Ditto. * runtime/offload_target.cpp: Ditto. * runtime/offload_target.h: Ditto. * runtime/offload_target_main.cpp: Ditto. * runtime/offload_timer.h: Ditto. * runtime/offload_timer_host.cpp: Ditto. * runtime/offload_timer_target.cpp: Ditto. * runtime/offload_trace.cpp: Ditto. * runtime/offload_trace.h: Ditto. * runtime/offload_util.cpp: Ditto. * runtime/offload_util.h: Ditto. * runtime/ofldbegin.cpp: Ditto. * runtime/ofldend.cpp: Ditto. * runtime/orsl-lite/include/orsl-lite.h: Ditto. * runtime/orsl-lite/lib/orsl-lite.c: Ditto. * runtime/orsl-lite/version.txt: Ditto. * runtime/use_mpss2.txt: Ditto. From-SVN: r217498
364 lines
11 KiB
C++
364 lines
11 KiB
C++
/*
|
|
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
|