Я пытаюсь проверить запрос mpi, если это делается или нет. Однако есть проблема, которую я не мог понять. Если я использую метод test_all, как показано ниже, я вижу, что этот запрос не выполняется.Какова цель повышения mpi request m_handler
string msg;
boost::mpi::request req = world->irecv(some_rank, 0, msg);
vector<boost::mpi::request> waitingRequests;
waitingRequests.push_back(req);
if(boost::mpi::test_all(waitingRequests.begin(), waitingRequests.end()))
cout << "test_all done" << endl;
Когда я пытаюсь этот код, я вижу, что запрос делается:
string msg;
boost::mpi::request req = world->irecv(some_rank, 0, msg);
if(req.test())
cout << "test done" << endl;
Итак, я посмотрел на код в test_all функции и понял, что она возвращает ложь из состояния «первого > m_handler "(строка 5 в приведенном ниже коде).
template<typename ForwardIterator> bool test_all(ForwardIterator first, ForwardIterator last) {
std::vector<MPI_Request> requests;
for (; first != last; ++first) {
// If we have a non-trivial request, then no requests can be completed.
if (first->m_handler || first->m_requests[1] != MPI_REQUEST_NULL)
return false;
requests.push_back(first->m_requests[0]);
}
int flag = 0;
int n = requests.size();
BOOST_MPI_CHECK_RESULT(MPI_Testall,
(n, &requests[0], &flag, MPI_STATUSES_IGNORE));
return flag != 0;
}
Теперь, интересно, для чего нужен m_handler.
MPI не поддерживает готовые объекты C++, такие как 'std :: string', поэтому' irecv' связывает с объектом запроса специальный метод обработчика, который обрабатывает данные входящих сообщений и преобразует их в 'станд :: string'. Вот что такое 'm_handler'. –
большое спасибо, это пояснительная записка. почему бы вам не написать его как ответ, поэтому я могу его принять. –