| 18 | |
| 19 | template <class Src, class Dst> |
| 20 | void run_noncontig_test() { |
| 21 | // use a relatively large size so synchronization problems can be detected |
| 22 | constexpr size_t S0 = 200, S1 = 500; |
| 23 | HostTensorND hv_init{CompNode::load("xpu0"), dtype::Float32()}; |
| 24 | hv_init.resize({S0, S1}); |
| 25 | for (size_t i = 0; i < S0 * S1; ++i) |
| 26 | hv_init.ptr<float>()[i] = i; |
| 27 | |
| 28 | Src src; |
| 29 | src.copy_from(hv_init); |
| 30 | |
| 31 | bool failed = false; |
| 32 | auto check = [&](size_t begin, size_t end) { |
| 33 | ASSERT_FALSE(failed); |
| 34 | failed = true; |
| 35 | |
| 36 | Src src_sub; |
| 37 | Dst dst; |
| 38 | src_sub = src.sub(Slice(begin, end).apply(src.layout(), 1)); |
| 39 | dst.copy_from(src_sub).sync(); |
| 40 | |
| 41 | HostTensorND rst; |
| 42 | rst.copy_from(dst).sync(); |
| 43 | |
| 44 | auto ptr = rst.ptr<float>(); |
| 45 | for (size_t i = 0; i < S0; ++i) |
| 46 | for (size_t j = begin; j < end; ++j) { |
| 47 | ASSERT_EQ(float(i * S1 + j), *ptr); |
| 48 | ++ptr; |
| 49 | } |
| 50 | |
| 51 | HostTensorND hv_zero{hv_init.comp_node(), dtype::Float32()}; |
| 52 | hv_zero.resize({S0, end - begin}); |
| 53 | memset(hv_zero.ptr<float>(), 0, hv_zero.layout().span().dist_byte()); |
| 54 | Dst dst_zero; |
| 55 | dst_zero.copy_from(hv_zero); |
| 56 | src_sub.copy_from_fixlayout(dst_zero); |
| 57 | HostTensorND src_hv; |
| 58 | src_hv.copy_from(src).sync(); |
| 59 | ptr = src_hv.ptr<float>(); |
| 60 | for (size_t i = 0; i < S0; ++i) |
| 61 | for (size_t j = begin; j < end; ++j) { |
| 62 | ASSERT_EQ(0.f, ptr[i * S1 + j]); |
| 63 | } |
| 64 | |
| 65 | src_sub.copy_from_fixlayout(dst).sync(); |
| 66 | |
| 67 | failed = false; |
| 68 | }; |
| 69 | |
| 70 | check(0, 1); |
| 71 | check(S1 - 1, S1); |
| 72 | check(0, S1 - 1); |
| 73 | check(1, S1); |
| 74 | check(12, 21); |
| 75 | } |
| 76 | } // anonymous namespace |
| 77 |
nothing calls this directly
no test coverage detected