Witam,
mam problem bo nie wiem gdzie robię błąd :(
Zamieszczam rysunek aby pokazać jak powinny komunikować się procesy. Ostatni wysyła do pierwszego, czyli do 0;
Kod przedstawiam poniżej
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
int rank, size;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Status status;
int wysyl = 0;
int odb = 0;
int x = 0;
int reszta = 0;
if(rank == 0) // proces 0 nastawia sie na odbior od ostatniego procesu
{
MPI_Recv(&odb,1,MPI_INT,size-1,99,MPI_COMM_WORLD,&status);
wysyl = 122;
if(size > 1)
MPI_Send(&wysyl,1,MPI_INT,rank*2+1,99,MPI_COMM_WORLD); // wysyla do procesu 1
if(size > 2)
MPI_Send(&wysyl,1,MPI_INT,rank*2+2,99,MPI_COMM_WORLD); // wysyla do procesu 2
}
if(rank > 1) // kazdy proces powyzej 0 bedzie odbieral wiadomos
{
if(rank == 1)
MPI_Recv(&odb,1,MPI_INT,0,99,MPI_COMM_WORLD,&status);
if(rank%2 == 0)
MPI_Recv(&odb,1,MPI_INT,rank/2-1,99,MPI_COMM_WORLD,&status);
if(rank%2 == 1 && rank > 1)
{
reszta = rank%2;
x = rank-reszta;
x /= 2;
MPI_Recv(&odb,1,MPI_INT,x,99,MPI_COMM_WORLD,&status);
}
}
if(rank < size/2 && rank > 0)// wysylka jest tylko przez polowe procesow
{
if(size%2 == 0)
cout << "liczba procesow musi byc nieparzysta, lub wynosic 2" << endl;
if(size%2 == 1)
{
wysyl = 12;
MPI_Send(&wysyl,1,MPI_INT,rank*2+1,99,MPI_COMM_WORLD);
MPI_Send(&wysyl,1,MPI_INT,rank*2+2,99,MPI_COMM_WORLD);
}
}
if(rank == size-1) // ostatni proces wysyla do zerowego
{
wysyl = 999;
MPI_Send(&wysyl,1,MPI_INT,0,99,MPI_COMM_WORLD);
}
cout << "proces: " << rank << "-wyslal: " << wysyl << " odebral: " << odb << endl;
MPI_Finalize();
return 0;
}
- Rysunek1.jpg (16 KB) - ściągnięć: 164