29 std::vector<MPI_Request> rqs;
30 std::vector<bool> is_ready;
32 size_t ready_count = 0;
35 MPI_Request &new_request() {
37 is_ready.push_back(
false);
41 size_t size()
const {
return rqs.size(); }
42 bool is_event_ready(
size_t i)
const {
return is_ready[i]; }
43 std::vector<MPI_Request> &requests() {
return rqs; }
46 for (
size_t i = 0; i < rqs.size(); i++) {
49 shamcomm::mpi::Test(&rqs[i], &ready, MPI_STATUS_IGNORE);
58 bool all_ready()
const {
return ready_count == rqs.size(); }
61 if (ready_count == rqs.size()) {
64 std::vector<MPI_Status> st_lst(rqs.size());
65 shamcomm::mpi::Waitall(
67 ready_count = rqs.size();
68 is_ready.assign(rqs.size(),
true);
71 size_t remain_count_no_test() {
return rqs.size() - ready_count; }
73 size_t remain_count() {
75 return rqs.size() - ready_count;
78 void report_timeout()
const {
79 std::string err_msg =
"";
80 for (
size_t i = 0; i < rqs.size(); i++) {
82 err_msg += shambase::format(
"request {} is not ready\n", i);
85 std::string msg = shambase::format(
"timeout : \n{}", err_msg);
90 void spin_lock_partial_wait(
size_t max_in_flight,
f64 timeout,
f64 print_freq) {
92 if (rqs.size() < max_in_flight) {
98 f64 last_print_time = 0;
101 while ((in_flight = remain_count()) >= max_in_flight) {
107 if (twait.
elasped_sec() - last_print_time > print_freq) {
110 "too many messages in flight :",