@@ -360,11 +360,32 @@ ov::SoPtr<ov::ITensor> ov::npuw::util::view(const ov::SoPtr<ov::ITensor>& src,
360
360
std::size_t offset,
361
361
std::size_t len) {
362
362
const auto & shape = src->get_shape ();
363
+ NPUW_ASSERT (dim < shape.size ());
363
364
View view_start = View (shape.size (), 0u );
364
365
View view_end = shape;
365
366
view_start[dim] = offset;
366
367
view_end[dim] = offset + len;
367
- return ov::npuw::util::view (src, view_start, view_end);
368
+
369
+ auto ret_view = ov::npuw::util::view (src, view_start, view_end);
370
+
371
+ // Check if a tensor view can be faked as "continuous"
372
+ // FIXME: This trick should be removed after strided tensor
373
+ // checks are relaxed
374
+ if (std::all_of (shape.begin (), shape.begin () + dim, [](std::size_t d) { return d == 1u ; })) {
375
+ // If all dimensions up to the sub-ranged dimension are 1s,
376
+ // This tensor can be faked as continuous
377
+ const auto type = src->get_element_type ();
378
+ const auto view_shape = ret_view->get_shape ();
379
+ ov::Strides fake_strides (shape.size ());
380
+ fake_strides.back () = type.size ();
381
+ std::transform (view_shape.crbegin (),
382
+ view_shape.crend () - 1 ,
383
+ fake_strides.rbegin (),
384
+ fake_strides.rbegin () + 1 ,
385
+ std::multiplies<size_t >());
386
+ return ov::get_tensor_impl (ov::Tensor (type, view_shape, ret_view->data (), fake_strides));
387
+ }
388
+ return ret_view;
368
389
}
369
390
370
391
template <typename InT>
0 commit comments