2015-06-19 1 views
1

Я пытаюсь проверить запрос 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.

+1

MPI не поддерживает готовые объекты C++, такие как 'std :: string', поэтому' irecv' связывает с объектом запроса специальный метод обработчика, который обрабатывает данные входящих сообщений и преобразует их в 'станд :: string'. Вот что такое 'm_handler'. –

+0

большое спасибо, это пояснительная записка. почему бы вам не написать его как ответ, поэтому я могу его принять. –

ответ

1

MPI не поддерживает встроенные сложные объекты C++, такие как std::string. Вот почему Boost.MPI сериализует и соответственно десериализует такие объекты при передаче их в виде сообщений MPI. С семантической точки зрения неблокирующая операция, начатая irecv(), должна завершиться после получения данных, и объект std::string был заполнен соответствующим образом. Дополнительный этап обработки принятого сообщения и deserialising его производится с помощью специального метода обработчика, указатель на который хранится в переменной m_handler:

... 
if (m_handler) { 
    // This request is a receive for a serialized type. Use the 
    // handler to test for completion. 
    return m_handler(this, ra_test); 
} else ... 

Нет такой обработки не требуется для простых типов данных.

То же самое относится к isend(), когда он работает с объектами C++. В этом случае обработчик не подключен, но данные класса отправляются в виде двух отдельных сообщений, и для обоих отправлений требуется особое внимание. Это то, что для второго булевского выражения (m_requests[1] != MPI_REQUEST_NULL).

Смежные вопросы