Можно ли заставить 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 это блокирует на неопределенный срок.

1

Решение

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

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

2

Другие решения

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

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

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

1

Вы можете рассмотреть возможность настройки нетерпеливый лимит значение (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), например.

1
По вопросам рекламы [email protected]