0

Boost::thread を使用して MPI プロセスごとに 2 つのスレッドを生成する MPI プログラム (Visual Studio 2k8 + MSMPI) を作成していますが、追跡に問題があるという問題が発生しました。

でプログラムを実行すると: mpiexec -n 2 program.exe、プロセスの1つが突然終了します:

job aborted:
[ranks] message

[0] terminated

[1] process exited without calling finalize

---- error analysis -----

[1] on winblows
program.exe ended prematurely and may have crashed. exit code 0xc0000005


---- error analysis -----

最初のプロセスが突然終了する理由がわかりません。理由を突き止める方法もわかりません。これは、すべての操作の最後にランク 0 のプロセスを無限ループに入れた場合でも発生します... 突然停止します。私の主な機能は次のようになります。

int _tmain(int argc, _TCHAR* argv[])
{
    /* Initialize the MPI execution environment. */
    MPI_Init(0, NULL);

    /* Create the worker threads. */
    boost::thread masterThread(&Master);
    boost::thread slaveThread(&Slave);

    /* Wait for the local test thread to end. */
    masterThread.join();
    slaveThread.join();

    /* Shutdown. */
    MPI_Finalize();
    return 0;
}

master関数とslave関数が終了する前に任意の作業を行う場所。少なくとも、マスター スレッドがその操作の最後に達していることを確認できます。スレーブ スレッドは常に、実行が中止される前に完了していないスレッドです。print ステートメントを使用すると、スレーブ スレッドで実際にエラーが発生していないように見えます... 順調に進んでいて、クラッシュに巻き込まれただけです。

それで、誰かが次のことについて何か考えを持ってい
ますか? a) 何が原因でしょうか?
b) どのようにデバッグすればよいですか?

本当にありがとう!

編集:

マスター/スレーブ機能の最小限のバージョンを投稿します。このプログラムの目的は純粋にデモンストレーションを目的としていることに注意してください...そのため、何も役に立ちません。基本的に、マスター スレッドはダミー ペイロードを他の MPI プロセスのスレーブ スレッドに送信します。

void Master()
{   
    int  myRank;
    int  numProcs;
    MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
    MPI_Comm_rank(MPI_COMM_WORLD, &myRank);

    /* Create a message with numbers 0 through 39 as the payload, addressed 
     * to this thread. */
    int *payload= new int[40];
    for(int n = 0; n < 40; n++) {
        payload[n] = n;
    }

    if(myRank == 0) {
        MPI_Send(payload, 40, MPI_INT, 1, MPI_ANY_TAG, MPI_COMM_WORLD);
    } else {
        MPI_Send(payload, 40, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD);
    }

    /* Free memory. */
    delete(payload);
}

void Slave()
{
    MPI_Status status;
    int *payload= new int[40];
    MPI_Recv(payload, 40, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

    /* Free memory. */
    delete(payload);
}
4

1 に答える 1

1

mpi ランタイムのスレッド セーフ バージョンを使用する必要があります。を読んでくださいMPI_Init_thread

于 2010-03-09T22:48:02.030 に答える