#include "mpi.h" /* dolacza plik naglowkowy potrzebny dla biblioteki MPI */ #include /* potrzebny dla funkcji 'fprintf()' */ #include int main(int argc, char **argv) { int myid, size, namelen; char computer_name[512]; /* nazwa komputera na ktorym */ int a[2], b, send; int next, prev; int break_signal = 17; // losowane wartosci beda < 10 MPI_Status status; MPI_Init(&argc, &argv); /* inicjalizuje srodowisko MPI */ /* pobiera identyfikator biezacego procesu */ MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &size); /* Pobiera nazwe komputera na ktorym proces sie wykonuje */ MPI_Get_processor_name(computer_name, &namelen); srandom((myid+1)*time(NULL)); a[0] = random()%10; fprintf(stderr, "Proces %d z %d na %s licytuje: %d\n", myid, size, computer_name, a[0]); next = (myid+1)%size; prev = (myid-1+size)%size; send = -1; b = 0; if (myid == 0) { send = 0; printf("Start licytacji (proces %d). Wysylam %d\n", myid, send); MPI_Send(&send, 1, MPI_INT, next, 12, MPI_COMM_WORLD); } while(b < break_signal) { MPI_Recv(&b, 1, MPI_INT, prev, 12, MPI_COMM_WORLD, &status); printf("Tu proces %d: odebralem %d\n", myid, b); // wyslalismy to co dostalismy - wygrana if (b == send) { printf("Tu proces %d: wygralem, konczymy zabawe!\n", myid); MPI_Send(&break_signal, 1, MPI_INT, next, 12, MPI_COMM_WORLD); break; } if (b == break_signal) { printf("Tu proces %d: dostalem sygnal zakonczenia\n", myid); } // mozemy dalej licytowac if (a[0] > b) { send = b+1; printf("Tu proces %d: licytuje dalej - %d\n", myid, send); MPI_Send(&send, 1, MPI_INT, next, 12, MPI_COMM_WORLD); } else if (a[0] <= b) { // przesylamy tylko dalej to samo send = b; printf("Tu proces %d: PAS!\n", myid); MPI_Send(&send, 1, MPI_INT, next, 12, MPI_COMM_WORLD); } } /* konczy dzialanie srodowiska MPI */ MPI_Finalize(); return 0; }