static bool rt_valid(DstBlock& dst, SrcBlock const& src) { bool rt = true; // If performing a copy, both source and destination blocks // must be unit stride and dense. if (Type_equal<src_order_type, dst_order_type>::value) { Ext_data<DstBlock> dst_ext(dst, SYNC_OUT); Ext_data<SrcBlock> src_ext(src, SYNC_IN); dimension_type const s_dim0 = src_order_type::impl_dim0; dimension_type const s_dim1 = src_order_type::impl_dim1; dimension_type const d_dim0 = dst_order_type::impl_dim0; dimension_type const d_dim1 = dst_order_type::impl_dim1; if (dst_ext.stride(d_dim1) != 1 || dst_ext.stride(d_dim0) != static_cast<stride_type>(dst.size(2, d_dim1)) || src_ext.stride(s_dim1) != 1 || src_ext.stride(s_dim0) != static_cast<stride_type>(src.size(2, s_dim1))) rt = false; } rt &= dst.size(2, 0) * dst.size(2, 1) > tunable_threshold(); rt &= cbe::Task_manager::instance()->num_spes() > 0; return rt; }
static void exec(DstBlock& dst, SrcBlock const& src, row2_type, col2_type) { vsip::impl::Ext_data<DstBlock> dst_ext(dst, vsip::impl::SYNC_OUT); vsip::impl::Ext_data<SrcBlock> src_ext(src, vsip::impl::SYNC_IN); // In-place transpose if (is_same_ptr(dst_ext.data(), src_ext.data())) { // in-place transpose implies square matrix assert(dst.size(2, 0) == dst.size(2, 1)); ip_transpose(dst_ext.data(), dst_ext.stride(0), dst_ext.stride(1), dst.size(2, 0), dst.size(2, 1)); } else if (dst_ext.stride(1) == 1 && src_ext.stride(0) == 1) { transpose_unit(dst_ext.data(), src_ext.data(), dst.size(2, 1), dst.size(2, 0), // rows, cols dst_ext.stride(0), // dst_col_stride src_ext.stride(1)); // src_row_stride } else { transpose(dst_ext.data(), src_ext.data(), dst.size(2, 1), dst.size(2, 0), // rows, cols dst_ext.stride(1), dst_ext.stride(0), // dst strides src_ext.stride(1), src_ext.stride(0)); // srd strides } }
static void exec(DstBlock& dst, SrcBlock const& src, col2_type, col2_type) { Ext_data<DstBlock> dst_ext(dst, SYNC_OUT); Ext_data<SrcBlock> src_ext(src, SYNC_IN); if (dst_ext.stride(0) == 1 && src_ext.stride(0) == 1) { assert(dst_ext.stride(1) == static_cast<stride_type>(dst.size(2, 0))); assert(src_ext.stride(1) == static_cast<stride_type>(src.size(2, 0))); cml::vcopy( src_ext.data(), 1, dst_ext.data(), 1, dst.size(2, 0) * dst.size(2, 1) ); } else assert(0); }
static void exec(DstBlock& dst, SrcBlock const& src, row2_type, col2_type) { Ext_data<DstBlock> dst_ext(dst, SYNC_OUT); Ext_data<SrcBlock> src_ext(src, SYNC_IN); if (dst_ext.stride(1) == 1 && src_ext.stride(0) == 1) { cml::transpose_unit( src_ext.data(), src_ext.stride(1), dst_ext.data(), dst_ext.stride(0), dst.size(2, 0), dst.size(2, 1)); } else { cml::transpose( src_ext.data(), src_ext.stride(1), src_ext.stride(0), dst_ext.data(), dst_ext.stride(0), dst_ext.stride(1), dst.size(2, 0), dst.size(2, 1)); } }
str_id_t ResPath<T,TAllocator_T>::resTypeID () const { str_id_t src_ext( this->extName().c_str() ); return fsys::src_to_rtype (src_ext); }