Можно ли заставить MPI всегда блокировать при отправке?

Есть ли способ заставить MPI всегда блокировать при отправке? Это может быть полезно при поиске взаимоблокировок в распределенном алгоритме, который в противном случае зависит от буферизации, которую MPI может выбрать при отправке.

Например, следующая программа (работает с 2 процессами) работает без проблем на моем компьютере:

// C++
#include <iostream>
#include <thread>

// Boost
#include <boost/mpi.hpp>
namespace mpi = boost::mpi;

int main() {
    using namespace std::chrono_literals;

    mpi::environment env;
    mpi::communicator world;
    auto me = world.rank();
    auto other = 1 - me;

    char buffer[10] = {0};

    while (true) {
        world.send(other, 0, buffer);
        world.recv(other, 0, buffer);
        std::cout << "Node " << me << " received" << std::endl;

        std::this_thread::sleep_for(200ms);
    }
}

Но если я изменю размер буфера на 10000, он блокируется на неопределенный срок.

3 ответа

Решение

Что касается чистых кодов MPI, то, что вы описываете, это именно то, что MPI_Ssend() дает тебе. Однако здесь вы не используете чистый MPI, вы используете boost:: mpi. И, к сожалению, согласно документации boost:: mpi, MPI_Ssend() не поддерживается

Тем не менее, может быть boost:: mpi предлагает другой способ, но я сомневаюсь в этом.

Вы можете настроить ограничение предельного значения ( http://blogs.cisco.com/performance/what-is-an-mpi-eager-limit) для принудительной блокировки операции отправки при любом размере сообщения. Способ установления предела, зависит от MPI реализация. На Intel MPI Вы можете использовать I_MPI_EAGER_THRESHOLD Переменная среды (см., например, https://software.intel.com/sites/products/documentation/hpc/ics/impi/41/lin/Reference_Manual/Communication_Fabrics_Control.htm).

Если вы хотите блокировать поведение, используйте MPI_Ssend. Он будет блокироваться до тех пор, пока не будет отправлен соответствующий прием, без буферизации запроса. Объем буферизации, предоставляемый MPI_Send, (намеренно) зависит от реализации. Поведение, которое вы получаете для буфера 10000, может отличаться при попытке другой реализации.

Я не знаю, сможете ли вы на самом деле настроить конфигурацию буферизации, и я бы не стал пытаться, потому что она не была бы переносимой. Вместо этого я бы попытался использовать вариант MPI_Ssend в некоторой конфигурации отладки и использовать MPI_Send по умолчанию, когда требуется лучшая производительность.

(Отказ от ответственности: я не знаком с реализацией Boost, но MPI является стандартом. Кроме того, я увидел комментарий Жиля после публикации этого ответа...)

Другие вопросы по тегам