mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			130 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|     Copyright (c) 2014-2016 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.
 | |
| */
 | |
| 
 | |
| 
 | |
| // The parts of the offload library used only on the target
 | |
| 
 | |
| #ifndef OFFLOAD_TARGET_H_INCLUDED
 | |
| #define OFFLOAD_TARGET_H_INCLUDED
 | |
| 
 | |
| #include "offload_common.h"
 | |
| #include "coi/coi_server.h"
 | |
| 
 | |
| // The offload descriptor.
 | |
| class OffloadDescriptor
 | |
| {
 | |
| public:
 | |
|     ~OffloadDescriptor() {
 | |
|         if (m_vars != 0) {
 | |
|             free(m_vars);
 | |
|             free(m_vars_extra);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Entry point for COI. Synchronously execute offloaded region given
 | |
|     // the provided buffers, misc and return data.
 | |
|     static void offload(
 | |
|         uint32_t  buffer_count,
 | |
|         void**    buffers,
 | |
|         void*     misc_data,
 | |
|         uint16_t  misc_data_len,
 | |
|         void*     return_data,
 | |
|         uint16_t  return_data_len
 | |
|     );
 | |
| 
 | |
|     // scatters input data from in buffer to target variables
 | |
|     void scatter_copyin_data();
 | |
| 
 | |
|     // gathers output data to the buffer
 | |
|     void gather_copyout_data();
 | |
| 
 | |
|     // merges local variable descriptors with the descriptors received from
 | |
|     // host
 | |
|     void merge_var_descs(VarDesc *vars, VarDesc2 *vars2, int vars_total);
 | |
| 
 | |
|     int get_offload_number() const {
 | |
|         return m_offload_number;
 | |
|     }
 | |
| 
 | |
|     void set_offload_number(int number) {
 | |
|         m_offload_number = number;
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     // Constructor
 | |
|     OffloadDescriptor() : m_vars(0)
 | |
|     {}
 | |
| 
 | |
| private:
 | |
|     typedef std::list<void*> BufferList;
 | |
| 
 | |
|     // 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_buffers;
 | |
| 
 | |
|     // Variable descriptors received from host
 | |
|     VarDesc* m_vars;
 | |
|     int      m_vars_total;
 | |
|     int      m_offload_number;
 | |
| 
 | |
|     // extra data associated with each variable descriptor
 | |
|     struct VarExtra {
 | |
|         uint16_t type_src;
 | |
|         uint16_t type_dst;
 | |
|     };
 | |
| 
 | |
|     VarExtra* m_vars_extra;
 | |
| };
 | |
| 
 | |
| // one time target initialization in main
 | |
| DLL_LOCAL extern void __offload_target_init(void);
 | |
| 
 | |
| // logical device index
 | |
| DLL_LOCAL extern int mic_index;
 | |
| 
 | |
| // total number of available logical devices
 | |
| DLL_LOCAL extern int mic_engines_total;
 | |
| 
 | |
| // device frequency (from COI)
 | |
| DLL_LOCAL extern uint64_t mic_frequency;
 | |
| 
 | |
| struct RefInfo {
 | |
|     RefInfo(bool is_add, long amount):is_added(is_add),count(amount)
 | |
|     {}
 | |
|     bool is_added;
 | |
|     long count;
 | |
| };
 | |
| 
 | |
| #endif // OFFLOAD_TARGET_H_INCLUDED
 |