1

MPI を強制的に送信時に常にブロックする方法はありますか? これは、 MPI が send で実行することを選択する可能性のあるバッファリングに依存する分散アルゴリズムでデッドロックを探す場合に役立つ場合があります。

たとえば、次のプログラム (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に変更すると、無期限にブロックされます。

4

3 に答える 3

2

純粋な MPI コードの場合、記述したとおりのものMPI_Ssend()が得られます。ただし、ここでは純粋な MPI を使用しておらず、boost::mpi を使用しています。残念ながら、boost::mpi のドキュメントによると、MPI_Ssend()サポートされていません。

そうは言っても、おそらくboost::mpiは別の方法を提供していますが、私はそれを疑っています。

于 2016-01-10T14:27:49.563 に答える
1

熱心な制限値 ( http://blogs.cisco.com/performance/what-is-an-mpi-eager-limit ) を調整して、任意のメッセージ サイズで送信操作を強制的にブロックすることを検討できます。熱心な制限を確立する方法は、MPI実装によって異なります。たとえば、環境変数Intel MPIを使用できます ( https://software.intel.com/sites/products/documentation/hpc/ics/impi/41/lin/Reference_Manual/Communication_Fabrics_Control.htmを参照)。I_MPI_EAGER_THRESHOLD

于 2016-01-10T14:30:26.447 に答える
1

ブロック動作が必要な場合は、MPI_Ssend を使用します。要求をバッファリングせずに、一致する受信がポストされるまでブロックします。MPI_Send によって提供されるバッファリングの量は (意図的に) 実装固有です。10000 のバッファーで得られる動作は、別の実装を試すと異なる場合があります。

実際にバッファリング構成を微調整できるかどうかはわかりません。また、移植性がないため、試しません。代わりに、一部のデバッグ構成で MPI_Ssend バリアントを使用し、最高のパフォーマンスが必要な場合はデフォルトの MPI_Send を使用します。

(免責事項:ブーストの実装には詳しくありませんが、MPIは標準です。また、この回答を投稿した後にGillesのコメントを見ました...)

于 2016-01-10T14:25:59.953 に答える