| 151 | } // namespace |
| 152 | |
| 153 | Maybe<void> DataConsistencyCheck(const void* buffer_ptr, size_t buffer_size, |
| 154 | Symbol<ParallelDesc> placement) { |
| 155 | if (!placement->containing_current_rank() || placement->parallel_num() == 1) { |
| 156 | return Maybe<void>::Ok(); |
| 157 | } |
| 158 | |
| 159 | const auto& rank_group = JUST(RankGroup::New(placement)); |
| 160 | |
| 161 | std::vector<char> recv_buffer(buffer_size); |
| 162 | char* recv_ptr = recv_buffer.data(); |
| 163 | |
| 164 | TransportToken transport_token = JUST(TransportToken::NewTransportToken(kTransportTokenTypeData)); |
| 165 | NaiveAsyncTransportCtx ctx( |
| 166 | transport_token, |
| 167 | [&](void** buffer, std::size_t* size, std::function<void()>* Cb) -> Maybe<void> { |
| 168 | *buffer = const_cast<void*>(buffer_ptr); |
| 169 | *size = buffer_size; |
| 170 | *Cb = [] {}; |
| 171 | return Maybe<void>::Ok(); |
| 172 | }, |
| 173 | [&](void** buffer, std::size_t* size, std::function<void()>* Cb) -> Maybe<void> { |
| 174 | *buffer = recv_ptr; |
| 175 | *size = buffer_size; |
| 176 | *Cb = [] {}; |
| 177 | return Maybe<void>::Ok(); |
| 178 | }); |
| 179 | JUST(TransportUtil::SendToNextRankInRing(rank_group, transport_token, &ctx)); |
| 180 | JUST(TransportUtil::ReceiveFromPrevRankInRing(rank_group, transport_token, &ctx)); |
| 181 | JUST_MSG(ctx.WaitDone(), kAsymmetricCodeErrorMsg); |
| 182 | CHECK_OR_RETURN(std::memcmp(buffer_ptr, reinterpret_cast<const void*>(recv_ptr), buffer_size) |
| 183 | == 0) |
| 184 | << Error::RuntimeError() << "Each rank must have same input sequence or numpy array"; |
| 185 | return Maybe<void>::Ok(); |
| 186 | } |
| 187 | |
| 188 | namespace { |
| 189 |
no test coverage detected