Можно ли заставить 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 является стандартом. Кроме того, я увидел комментарий Жиля после публикации этого ответа...)