MPIハイパーキューブブロードキャストエラー
質問
MPIを使用して書かれたHypercubeのすべてのブロードキャスト方法を持っています。
one2allbcast(int n, int rank, void *data, int count, MPI_Datatype dtype)
{
MPI_Status status;
int mask, partner;
int mask2 = ((1 << n) - 1) ^ (1 << n-1);
for (mask = (1 << n-1); mask; mask >>= 1, mask2 >>= 1)
{
if (rank & mask2 == 0)
{
partner = rank ^ mask;
if (rank & mask)
MPI_Recv(data, count, dtype, partner, 99, MPI_COMM_WORLD, &status);
else
MPI_Send(data, count, dtype, partner, 99, MPI_COMM_WORLD);
}
}
}
メインからそれを呼ぶと:
int main( int argc, char **argv )
{
int n, rank;
MPI_Init (&argc, &argv);
MPI_Comm_size (MPI_COMM_WORLD, &n);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
one2allbcast(floor(log(n) / log (2)), rank, "message", sizeof(message), MPI_CHAR);
MPI_Finalize();
return 0;
}
8つのノードをコンパイルして実行すると、データを受信するポイントの前に1、3、5、7を処理することを報告する一連のエラーを受け取ります。
MPI_Recv: process in local group is dead (rank 1, MPI_COMM_WORLD)
Rank (1, MPI_COMM_WORLD): Call stack within LAM:
Rank (1, MPI_COMM_WORLD): - MPI_Recv()
Rank (1, MPI_COMM_WORLD): - main()
MPI_Recv: process in local group is dead (rank 3, MPI_COMM_WORLD)
Rank (3, MPI_COMM_WORLD): Call stack within LAM:
Rank (3, MPI_COMM_WORLD): - MPI_Recv()
Rank (3, MPI_COMM_WORLD): - main()
MPI_Recv: process in local group is dead (rank 5, MPI_COMM_WORLD)
Rank (5, MPI_COMM_WORLD): Call stack within LAM:
Rank (5, MPI_COMM_WORLD): - MPI_Recv()
Rank (5, MPI_COMM_WORLD): - main()
MPI_Recv: process in local group is dead (rank 7, MPI_COMM_WORLD)
Rank (7, MPI_COMM_WORLD): Call stack within LAM:
Rank (7, MPI_COMM_WORLD): - MPI_Recv()
Rank (7, MPI_COMM_WORLD): - main()
どこで間違っていますか?
解決
エラーがラインにあったことがわかりました
if (rank & mask2 == 0)
オペレーターの優先順位を説明していない場合。それを書く正確で機能する方法はそうです
if ((rank & mask2) == 0)
ここでビットワイズ &
最初に評価されます。
他のヒント
それは 一般的なエラー mpi通信が要求された場合 MPI_Finalize
呼ばれています。電話する前に MPI_Finalize
すべてのMPI呼び出しが完了したかどうかをテストします。
// a c# class for one-to-all broadcast on a hypercube
class Program
{
static void Main(string[] args)
{
using (new MPI.Environment(ref args))
{
string strMsg = "msg";
Intracommunicator comm = Communicator.world;
int my_id = comm.Rank;
int d = Convert.ToInt32(Math.Log(comm.Size, 2));
///////////////////////////////////////////////
int power2i = 0;
int msgDestination = 0, msgSource = 0;
//d=0xff;
//Console.WriteLine("d:{0:x}", d);
int mask = Convert.ToInt32(Math.Pow(2, d)) - 1;
//Console.WriteLine("first: " + Convert.ToString(mask, 2));
//Console.WriteLine("second: " + mask.ToString());
comm.Barrier();
for (int i = d - 1; i >= 0; i--)
{
power2i = Convert.ToInt32(Math.Pow(2, i));
mask = mask ^ power2i;
//Console.WriteLine("third: " + "i: " + i + "-" + Convert.ToString(mask, 2));
if ((my_id & mask) == 0)
{
if ((my_id & power2i) == 0)
{
msgDestination = my_id ^ power2i;
comm.Send<string>(strMsg, msgDestination, 1);
Console.WriteLine("process: " + my_id + "- sent: " + strMsg + " to: " + msgDestination + "-@: " + DateTime.Now.Millisecond);
}
else
{
msgSource = my_id ^ power2i;
strMsg = comm.Receive<string>(msgSource, 1);
//Console.WriteLine("process: " + my_id + "- received: " + strMsg + " from: " + msgSource + "-@: " + i);
}
}
}
/////////////////////////////////////////////////////////////////////////////////
}
}
所属していません StackOverflow