1

MPI_Bcast でエラーが発生します (古いエラーだと思います)。なぜこれが起こっているのかわかりません。エラーは次のとおりです。

An error occurred in MPI_Bcast    
on communicator MPI_COMM_WORLD  
MPI_ERR_TRUNCATE: message truncated      
MPI_ERRORS_ARE_FATAL: your MPI job will now abort

それが発生するコードは次のとおりです。

for (int i = 0; i < nbProcs; i++){
    for (int j = firstLocalGrainRegion; j < lastLocalGrainRegion; j++){
        GrainRegion * grainRegion = microstructure->getGrainRegionAt(j);
        int grainSize = grainRegion->getBoxSize(nb);
        double * newValues;
        if (myId == i)
            newValues = grainRegion->getNewValues();
        else
            newValues = new double[grainSize]; 
        MPI_Bcast(newValues, grainSize, MPI_DOUBLE, i, MPI_COMM_WORLD);
        MPI_Barrier(MPI_COMM_WORLD);

        if (myId != i)
            grainRegion->setNewValues(newValues);
    }   
}
4

1 に答える 1

2

エラーには 2 つの理由が考えられます。

最初のものは、保留中の previous がありMPI_Bcast、外側のループの前のどこかで開始され、完了していないことです。たとえば、この質問のような方法で完了しませんでした。

grainRegion->getBoxSize(nb)2 つ目は、プロセスごとに異なる値が返されるため、バッファ サイズの不一致が考えられることです。並列デバッガーを使用してコードを調べるか、ブロードキャストの前に print ステートメントを配置することができます。次に例を示します。

int grainSize = grainRegion->getBoxSize(nb);
printf("i=%d j=%d rank=%02d grainSize=%d\n", i, j, myId, grainSize);

この特定の出力形式を使用すると、出力を実行するだけで、sort不一致の値をすばやく見つけることができます。バリアは常に同期している (ブロードキャストは必ずしもそうである必要はない) ためMPI_Bcast、最初の可能性のあるケースのように、異なる呼び出しが互いに干渉する可能性はほとんどありません。

データ構造が分散され、実際に の正しい値がgrainSizeブロードキャスト ルート プロセスでしか利用できない場合は、最初に他のランクに正しいサイズを通知する必要があります。最も単純な (しかし最も効率的ではない) 解決策は、ブロードキャストすることgrainSizeです。より良い解決策は、最初MPI_Allgatherに各プロセスで粒状領域の数で を実行し (必要な場合のみ)、次にMPI_Allgatherv各領域のサイズで を実行することです。

于 2012-12-02T15:36:48.787 に答える