void OffloadDescriptor::merge_var_descs( VarDesc *vars, VarDesc2 *vars2, int vars_total ) { // number of variable descriptors received from host and generated // locally should match if (m_vars_total < vars_total) { LIBOFFLOAD_ERROR(c_merge_var_descs1); exit(1); } for (int i = 0; i < m_vars_total; i++) { if (i < vars_total) { // variable type must match if (m_vars[i].type.bits != vars[i].type.bits) { LIBOFFLOAD_ERROR(c_merge_var_descs2); exit(1); } m_vars[i].ptr = vars[i].ptr; m_vars[i].into = vars[i].into; const char *var_sname = ""; if (vars2 != NULL) { if (vars2[i].sname != NULL) { var_sname = vars2[i].sname; } } OFFLOAD_DEBUG_TRACE_1(2, get_offload_number(), c_offload_var, " VarDesc %d, var=%s, %s, %s\n", i, var_sname, vardesc_direction_as_string[m_vars[i].direction.bits], vardesc_type_as_string[m_vars[i].type.src]); if (vars2 != NULL && vars2[i].dname != NULL) { OFFLOAD_TRACE(2, " into=%s, %s\n", vars2[i].dname, vardesc_type_as_string[m_vars[i].type.dst]); } } OFFLOAD_TRACE(2, " type_src=%d, type_dstn=%d, direction=%d, " "alloc_if=%d, free_if=%d, align=%d, mic_offset=%d, flags=0x%x, " "offset=%lld, size=%lld, count/disp=%lld, ptr=%p into=%p\n", m_vars[i].type.src, m_vars[i].type.dst, m_vars[i].direction.bits, m_vars[i].alloc_if, m_vars[i].free_if, m_vars[i].align, m_vars[i].mic_offset, m_vars[i].flags.bits, m_vars[i].offset, m_vars[i].size, m_vars[i].count, m_vars[i].ptr, m_vars[i].into); } }
void OffloadDescriptor::gather_copyout_data() { OFFLOAD_TIMER_STOP(c_offload_target_compute); OFFLOAD_TIMER_START(c_offload_target_gather_outputs); for (int i = 0; i < m_vars_total; i++) { bool src_is_for_mic = (m_vars[i].direction.out || m_vars[i].into == NULL); switch (m_vars[i].type.src) { case c_data_ptr_array: break; case c_data: case c_void_ptr: case c_cean_var: if (m_vars[i].direction.out && !m_vars[i].flags.is_static) { m_out.send_data( static_cast<char*>(m_vars[i].ptr) + m_vars[i].disp, m_vars[i].size); } break; case c_dv: break; case c_string_ptr: case c_data_ptr: case c_cean_var_ptr: case c_dv_ptr: if (m_vars[i].free_if && src_is_for_mic && !m_vars[i].flags.is_static) { void *buf = *static_cast<char**>(m_vars[i].ptr) - m_vars[i].mic_offset - (m_vars[i].flags.is_stack_buf? 0 : m_vars[i].offset); if (buf == NULL) { break; } // decrement buffer reference count OFFLOAD_TIMER_START(c_offload_target_release_buffer_refs); BufReleaseRef(buf); OFFLOAD_TIMER_STOP(c_offload_target_release_buffer_refs); } break; case c_func_ptr: if (m_vars[i].direction.out) { m_out.send_func_ptr(*((void**) m_vars[i].ptr)); } break; case c_dv_data: case c_dv_ptr_data: case c_dv_data_slice: case c_dv_ptr_data_slice: if (src_is_for_mic && m_vars[i].free_if && !m_vars[i].flags.is_static) { ArrDesc *dvp = (m_vars[i].type.src == c_dv_data || m_vars[i].type.src == c_dv_data_slice) ? static_cast<ArrDesc*>(m_vars[i].ptr) : *static_cast<ArrDesc**>(m_vars[i].ptr); void *buf = reinterpret_cast<char*>(dvp->Base) - m_vars[i].mic_offset - m_vars[i].offset; if (buf == NULL) { break; } // decrement buffer reference count OFFLOAD_TIMER_START(c_offload_target_release_buffer_refs); BufReleaseRef(buf); OFFLOAD_TIMER_STOP(c_offload_target_release_buffer_refs); } break; default: LIBOFFLOAD_ERROR(c_unknown_var_type, m_vars[i].type.dst); abort(); } if (m_vars[i].into) { switch (m_vars[i].type.dst) { case c_data_ptr_array: break; case c_data: case c_void_ptr: case c_cean_var: case c_dv: break; case c_string_ptr: case c_data_ptr: case c_cean_var_ptr: case c_dv_ptr: if (m_vars[i].direction.in && m_vars[i].free_if && !m_vars[i].flags.is_static_dstn) { void *buf = *static_cast<char**>(m_vars[i].into) - m_vars[i].mic_offset - (m_vars[i].flags.is_stack_buf? 0 : m_vars[i].offset); if (buf == NULL) { break; } // decrement buffer reference count OFFLOAD_TIMER_START( c_offload_target_release_buffer_refs); BufReleaseRef(buf); OFFLOAD_TIMER_STOP( c_offload_target_release_buffer_refs); } break; case c_func_ptr: break; case c_dv_data: case c_dv_ptr_data: case c_dv_data_slice: case c_dv_ptr_data_slice: if (m_vars[i].free_if && m_vars[i].direction.in && !m_vars[i].flags.is_static_dstn) { ArrDesc *dvp = (m_vars[i].type.dst == c_dv_data_slice || m_vars[i].type.dst == c_dv_data) ? static_cast<ArrDesc*>(m_vars[i].into) : *static_cast<ArrDesc**>(m_vars[i].into); void *buf = reinterpret_cast<char*>(dvp->Base) - m_vars[i].mic_offset - m_vars[i].offset; if (buf == NULL) { break; } // decrement buffer reference count OFFLOAD_TIMER_START( c_offload_target_release_buffer_refs); BufReleaseRef(buf); OFFLOAD_TIMER_STOP( c_offload_target_release_buffer_refs); } break; default: LIBOFFLOAD_ERROR(c_unknown_var_type, m_vars[i].type.dst); abort(); } } } OFFLOAD_DEBUG_TRACE(2, "OUT buffer @ p %p size %lld\n", m_out.get_buffer_start(), m_out.get_buffer_size()); OFFLOAD_DEBUG_DUMP_BYTES(2, m_out.get_buffer_start(), m_out.get_buffer_size()); OFFLOAD_DEBUG_TRACE_1(1, get_offload_number(), c_offload_copyout_data, "Total copyout data sent to host: [%lld] bytes\n", m_out.get_tfr_size()); OFFLOAD_TIMER_STOP(c_offload_target_gather_outputs); }
void OffloadDescriptor::merge_var_descs( VarDesc *vars, VarDesc2 *vars2, int vars_total ) { // number of variable descriptors received from host and generated // locally should match if (m_vars_total < vars_total) { LIBOFFLOAD_ERROR(c_merge_var_descs1); exit(1); } for (int i = 0; i < m_vars_total; i++) { // instead of m_vars[i].type.src we will use m_vars_extra[i].type_src if (i < vars_total) { // variable type must match if (m_vars[i].type.bits != vars[i].type.bits) { OFFLOAD_TRACE(2, "m_vars[%d].type.bits=%08x, vars[%d].type.bits=%08x\n", i, m_vars[i].type.bits, i, vars[i].type.bits); LIBOFFLOAD_ERROR(c_merge_var_descs2); exit(1); } if (m_vars[i].type.src == c_extended_type) { VarDescExtendedType *etype = reinterpret_cast<VarDescExtendedType*>(vars[i].ptr); m_vars_extra[i].type_src = etype->extended_type; m_vars[i].ptr = etype->ptr; } else { m_vars_extra[i].type_src = m_vars[i].type.src; if (!(m_vars[i].flags.use_device_ptr && m_vars[i].type.src == c_dv)) { m_vars[i].ptr = vars[i].ptr; } } // instead of m_vars[i].type.dst we will use m_vars_extra[i].type_dst if (m_vars[i].type.dst == c_extended_type && i < vars_total) { VarDescExtendedType *etype = reinterpret_cast<VarDescExtendedType*>(vars[i].into); m_vars_extra[i].type_dst = etype->extended_type; m_vars[i].into = etype->ptr; } else { m_vars_extra[i].type_dst = m_vars[i].type.dst; m_vars[i].into = vars[i].into; } const char *var_sname = ""; if (vars2 != NULL) { if (vars2[i].sname != NULL) { var_sname = vars2[i].sname; } } OFFLOAD_DEBUG_TRACE_1(2, get_offload_number(), c_offload_var, " VarDesc %d, var=%s, %s, %s\n", i, var_sname, vardesc_direction_as_string[m_vars[i].direction.bits], vardesc_type_as_string[m_vars_extra[i].type_src]); if (vars2 != NULL && vars2[i].dname != NULL) { OFFLOAD_TRACE(2, " into=%s, %s\n", vars2[i].dname, vardesc_type_as_string[m_vars_extra[i].type_dst]); } } else { m_vars_extra[i].type_src = m_vars[i].type.src; m_vars_extra[i].type_dst = m_vars[i].type.dst; } OFFLOAD_TRACE(2, " type_src=%d, type_dstn=%d, direction=%d, " "alloc_if=%d, free_if=%d, align=%d, mic_offset=%d, flags=0x%x, " "offset=%lld, size=%lld, count/disp=%lld, ptr=%p into=%p\n", m_vars_extra[i].type_src, m_vars_extra[i].type_dst, m_vars[i].direction.bits, m_vars[i].alloc_if, m_vars[i].free_if, m_vars[i].align, m_vars[i].mic_offset, m_vars[i].flags.bits, m_vars[i].offset, m_vars[i].size, m_vars[i].count, m_vars[i].ptr, m_vars[i].into); } }