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));
    }
  }
Example #5
0
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); 
}