Есть ли способ заставить 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 это блокирует на неопределенный срок.
Для чистых кодов MPI то, что вы описываете, это именно то, что MPI_Ssend()
дает тебе. Однако здесь вы не используете чистый MPI, вы используете boost :: mpi. И, к сожалению, согласно boost :: документация mpi, MPI_Ssend()
не поддерживается
Тем не менее, может быть boost :: mpi предлагает другой способ, но я сомневаюсь в этом.
Если вы хотите блокировать поведение, используйте MPI_Ssend. Он будет блокироваться до тех пор, пока не будет отправлен соответствующий прием, без буферизации запроса. Объем буферизации, предоставляемый MPI_Send, (намеренно) зависит от реализации. Поведение, которое вы получаете для буфера 10000, может отличаться при попытке другой реализации.
Я не знаю, сможете ли вы на самом деле настроить конфигурацию буферизации, и я бы не стал пытаться, потому что она не была бы переносимой. Вместо этого я бы попытался использовать вариант MPI_Ssend в некоторой конфигурации отладки и использовать MPI_Send по умолчанию, когда требуется лучшая производительность.
(Отказ от ответственности: я не знаком с реализацией 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), например.