| 126 | static char* GetMutDptr(Blob* blob) { return blob->mut_dptr<char>(); } |
| 127 | |
| 128 | void ConcatSplitPartDataContent(ep::Stream* stream, const DataContentDesc& in_desc, |
| 129 | const DataContentDesc& out_desc, int32_t part_id, |
| 130 | int32_t part_num) { |
| 131 | size_t one_elem_size = in_desc.OneElemSize(); |
| 132 | BalancedSplitter bs(in_desc.TotalElemNum(), part_num); |
| 133 | Range range = bs.At(part_id); |
| 134 | int64_t in_idx = range.begin(); |
| 135 | int64_t in_elem_num = 0; |
| 136 | const char* in_ptr = nullptr; |
| 137 | int64_t out_idx = range.begin(); |
| 138 | int64_t out_elem_num = 0; |
| 139 | char* out_ptr = nullptr; |
| 140 | |
| 141 | while (in_elem_num > 0 || out_elem_num > 0 || in_idx < range.end() || out_idx < range.end()) { |
| 142 | if (in_elem_num == 0) { |
| 143 | std::tie(in_elem_num, in_ptr) = |
| 144 | in_desc.CalcContinuousElemNumStartFrom<const char, GetConstDptr>(in_idx); |
| 145 | in_elem_num = std::min(in_elem_num, range.end() - in_idx); |
| 146 | if (in_elem_num == 0) { break; } |
| 147 | in_idx += in_elem_num; |
| 148 | } |
| 149 | if (out_elem_num == 0) { |
| 150 | std::tie(out_elem_num, out_ptr) = |
| 151 | out_desc.CalcContinuousElemNumStartFrom<char, GetMutDptr>(out_idx); |
| 152 | out_elem_num = std::min(out_elem_num, range.end() - out_idx); |
| 153 | if (out_elem_num == 0) { break; } |
| 154 | out_idx += out_elem_num; |
| 155 | } |
| 156 | int64_t copy_elem_num = std::min(in_elem_num, out_elem_num); |
| 157 | size_t copy_size = copy_elem_num * one_elem_size; |
| 158 | Memcpy<DeviceType::kCPU>(stream, out_ptr, in_ptr, copy_size); |
| 159 | in_elem_num -= copy_elem_num; |
| 160 | out_elem_num -= copy_elem_num; |
| 161 | in_ptr += copy_size; |
| 162 | out_ptr += copy_size; |
| 163 | } |
| 164 | CHECK_EQ(in_elem_num, 0); |
| 165 | CHECK_EQ(out_elem_num, 0); |
| 166 | CHECK_EQ(in_idx, range.end()); |
| 167 | CHECK_EQ(out_idx, range.end()); |
| 168 | } |
| 169 | |
| 170 | void ConcatSplitDataContent(ep::Stream* stream, |
| 171 | const std::function<Blob*(const std::string&)>& BnInOp2Blob, |
no test coverage detected