/* ZMIANY w wersji 'balanced' - robimy dluga tablice kolumn - K -> N w alokacji - kazdy proces ma bezwzgledny numer wiersza - 0 -> rStart -1 - 1 -> rStart - K jako numer -> rEnd - K jako ilosc wierszy -> rEnd- rStart */ #include "mpi.h" #include #include int main(int argc, char **argv) { int K,N; int **tab, **tab2, **tmpwsk; int a, i, j, jed=0, flaga; int nb_count; //ilosc sasiadow int pokolenie, il_pok, next, prev, myid, psize; int completed; //numer requestu ktory sie skonczyl double pp; //prawdopodobienstwo jedynki double ttime=0, stime, etime; MPI_Status s[2]; MPI_Request rs[2]; MPI_Request rr[2]; int myTLast; int otherTLast; int myK; int otherK; double alfa = 2.0f; int rStart, rEnd; //odczytanie parametrow wywolania programu MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &psize); if (argc != 4) { fprintf(stderr, "Blad! Zle wywolanie. \n uzycie: %s \n", argv[0]); exit(1); } else { N = atoi(argv[1]); printf("nsize: %d ", N); pp = atof(argv[2]); printf("prawdop: %.2f\n", pp); il_pok=atoi(argv[3]); if ( pp > 1 || pp < 0) { fprintf(stderr, "Blad! Prawdopodobienstwo poza zakresem!!\n"); exit(1); } } //okreslenie po ile alokuja procesy K = N / psize; if (myid < (N % psize)) K++; rStart = myid*K+1; if (myid < (N % psize)) rStart += myid; else rStart +=N% psize; rEnd = rStart + K-1; fprintf(stderr, "proc %d alokuje %d od %d do %d\n", myid, K, rStart, rEnd); //alokacja pamieci na tablice i wyzerowanie pamieci tab = (int **) calloc(N+2, sizeof(int *)); tab2 = (int **) calloc(N+2, sizeof(int *)); for (i = rStart-1; i <= rEnd+1; i++) { tab[i] = (int *) calloc(N+2, sizeof(int)); tab2[i] = (int *) calloc(N+2, sizeof(int)); } //wypelnianie pola poczatkowymi wartosciami srandom(myid+time(NULL)); for (i=rStart; i<=rEnd; i++) for (j=0; j alfa*(moj/ilosc_moichwierszy) // przyjmuje jesli // moj-jego > alfa*(jego/ilosc_jegowierszy) // if ( tab2[0][N]-tab2[1][N] > alfa* (double)tab2/ ) if (pokolenie >2) { //przesuniecie z poprzednim myTLast=tab2[rStart][N]; otherTLast=tab2[rStart-1][N]; myK = tab2[rStart][N+1]; otherK = tab2[rStart-1][N+1]; if (myid>0) { //odddaje do poprzedniego if ( myTLast - otherTLast > alfa * myTLast/myK) { fprintf(stderr,"P:%d Pok:%d ODDAJE wiersz do poprzedniego\n",myid, pokolenie); //TODO! } //przyjmuje od poprzedniego if ( otherTLast - myTLast > alfa * otherTLast/otherK) { fprintf(stderr,"P:%d Pok:%d PRZYJMUJE wiersz od poprzedniego\n",myid, pokolenie); //TODO! } } //przesuniecia z nastepnym myTLast=tab2[rEnd][N]; otherTLast=tab2[rEnd+1][N]; myK = tab2[rEnd][N+1]; otherK = tab2[rEnd+1][N+1]; if (myid< psize-1) { //odddaje do nastepnego if (myTLast - otherTLast > alfa * myTLast/myK) { fprintf(stderr,"P:%d Pok:%d ODDAJE wiersz do nastepnego\n",myid, pokolenie); //TODO! } //przyjmuje od nastepnego if (otherTLast - myTLast > alfa * otherTLast/otherK) { fprintf(stderr,"P:%d Pok:%d PRZYJMUJE wiersz od nastepnego\n",myid, pokolenie); //TODO! } } } //wypisywanie pola po komunikacji //uwaga, zakladki z poptrzedniego pokolenia! /* for (i=0; i<=K+1; i++) { if (i==0 || i==K+1) printf("!"); printf("P%dW%02d: ",myid,i); for (j=0; j