Форум программистов, компьютерный форум, киберфорум
MPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 1
1

C++ игра Конвэя "Жизни" using MPI

31.12.2015, 05:06. Показов 1450. Ответов 0
Метки c++, mpi (Все метки)

Author24 — интернет-сервис помощи студентам
Может кто нибудь помочь решить задачку у меня есть серийный код для игры Конвэя "Жизни" , я новичок в этом деле пока что только учусь .. мне нужно сконвертировать из обычного кода в параллельное программирование using MPI .. но пока что-то не получается самому , может кто глянуть и помочь эту задачку решить шаг за шагом ? не написать готовый код , а подсказать что я делаю не так , буду очень признателен ..
вот сообственно и сам код , а тут серийник http://codepad.org/V9i6oyQy на всякий случай вставлю его в самом низу тоже

p.s извините коменты в коде на английском т.к курсы у меня все тоже на английском

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "math.h"
#include <memory.h>
#include "mpi.h" 
 
#define DIM 7 
#define FILENAME "life.dat"
 
void print_matrix(double Anew[DIM+2][DIM+2])    {
    int i,j;
 
    for(i=0;i<=DIM+1;i++)   {
        for(j=0;j<=DIM+1;j++) {
            printf("%4.2F    ",Anew[i][j]);
        }
        printf("\n");
    }
    printf("....................................\n");
}
 
 
 
int main(int argc, char **argv) {
    MPI_File myfile;       /* Shared file */
    double Anew[100][100];
    double A[100][100];
    register int i,j;
    int ok=0;
    double up,down,left,right,upleft,downright,upright,downleft;
    int iterations=0;
    int rank, dim;
    MPI_Status status;
 
    MPI_Init( &argc, &argv );
    MPI_Comm_dim( MPI_COMM_WORLD, &dim );
    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
 
    
    /* Open the file */
  MPI_File_open (MPI_COMM_WORLD, FILENAME, MPI_MODE_CREATE | MPI_MODE_WRONLY,
         MPI_INFO_NULL, &myfile);
  /* Set the file view */
  MPI_File_set_view(myfile, MPI_INT, MPI_INT,"life.dat", MPI_INFO_NULL);
  /* Write buf to the file */
  MPI_File_write(myfile, MPI_INT, MPI_STATUS_IGNORE);
  /* Close the file */
    
    /*Initialization*/
    for  (i=0; i<=DIM+1; i++)   {
            for (j=0; j<=DIM+1; j++) {
                A[i][j]=1;
                Anew[i][j]=1;
        }
        Anew[i][0]=-1;
        Anew[i][DIM+1]=-1;
        A[i][0]=-1;
        A[i][DIM+1]=-1;
    }
 
    /*Find how much matrix rows are assigned to each process. */
    int first_line=0, last_line=0;
    double lines_per_proc_tmp = (double)(DIM+2)/dim ;
    int lines_per_proc;
    if( (double)((int)lines_per_proc_tmp)== lines_per_proc_tmp) {
        lines_per_proc=(int)lines_per_proc_tmp;
    } else {
        lines_per_proc=(int)lines_per_proc_tmp+1;
    }
 
    /*First and last row for each process. */
    first_line = lines_per_proc*rank;
    last_line = first_line + lines_per_proc-1;
 
        /*For the last process adjust last line so it
        does not fall outside the matrix. */
 
        if (last_line > DIM); {
            last_line = DIM;
        }
        /*For the first process remove first line.
        (code optimization)*/
        if (first_line == 0)    {
            first_line = 1;
        }
 
        while(!ok)  {
            iterations++;
 
            /*Inform next process for my last line . */
            if (rank<dim-1) {
                MPI_Send(A[last_line], DIM+2, MPI_DOUBLE, rank+1, 1, MPI_COMM_WORLD);
            }
            /*be informed from the prev process for my pre first line. */
            if (rank > 0) { 
                MPI_Recv(A[first_line-1],DIM+2, MPI_DOUBLE, rank-1, 1, MPI_COMM_WORLD,&status);
            }
                /*inform previous process for my list line. */
                if (rank > 0) {
                    MPI_Send(A[first_line], DIM+2, MPI_DOUBLE, rank-1, 2, MPI_COMM_WORLD);
                }
                    /*Be informed from next process for my after-last line. */
                    if (rank > dim-1) {
                        MPI_Recv(A[last_line+1], DIM+2, MPI_DOUBLE, rank+1, 2, MPI_COMM_WORLD,&status);
                    }
 
                    for (i=first_line; i<=last_line; i++){ /*Compute the elements in this process's part
                                                           from first_line to last_line. */
                        for(j=1; j<DIM; j++) {                 /*For all columns*/
                            up = A[i-1][j];
                            down = A[i+1][j];
                            left = A[i][j-1];
                            right = A[i][j+1];
                            upleft = A[i-1][j] + A[i][j-1];
                            downright = A[i+1][j] + A[i][j+1]
                            upright = A[i-1][j] + A[i][j+1]
                            downleft = A[i+1][j] + A[i][j-1]
                            Anew[i][j] = (up + down + left + right + upleft + downright + upright + downleft)/4.0;
                        }
                    }
                    
                    /*Process 0 decides termination. */ 
                    if (rank==0) {
                        if (iterations>100) {
                            ok=1;
                        }           
                    }   
 
                    /*Process 0 broadcast ok. */    
                MPI_Bcast(&ok, 1, MPI_INT, 0, MPI_COMM_WORLD);
 
                    /*Copy Anew to A. */
                    memcpy(A, Anew, (dimof(double)*(DIM+2)*(DIM+2)));
                }   
                /*In the end all processes send their part to PO*/      
                //collect results
                if (rank==0) {
                    for (i=1;i<dim;i++) {
                        MPI_Recv(Anew[i*lines_per_proc], (DIM+2)*lines_per_proc, MPI_DOUBLE, i, 10, MPI_COMM_WORLD,&status);
                    }
                } else {
            MPI_Send(Anew[first_line], (DIM+2)*lines_per_proc, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD);
        }
        /*Show result from process 0*/  
        if(rank==0) {
            print_matrix(Anew);
            printf("iterations=%d\n" ,iterations);
            system("pause");
        }
        MPI_Finalize();
 
}

................................................................................ .........
................................................................................ .........
................Серийный Код.....................................................
................................................................................ .........


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <stdio.h>
#include <math.h>
 
int main(int argc, char **argv) {
    char * sFilename;
    int dim;
    int i, j;
    FILE *fid;
    int A[100][100];
    int Anew[100][100];
 
    if (argc == 2) {
        sFilename = argv[1]; /* filename is first argument */
    }
    else {
        sFilename = "life.dat"; /* default filename */
    }
 
    fid = fopen(sFilename, "r");
    if (!fid) {
        /* if filename does not exist then exit program */
        printf("No such file %s\n", sFilename);
        return -1;
    }
    else {
        /* Read array dimension */
        printf("Reading file: %s\n", sFilename);
        fflush(stdout);
        fscanf(fid, "%d", &dim);
 
        /* Create numNodes nodes */
        for (i = 0; i < dim; i++) {
            for (j = 0; j < dim; j++) {
                // Read A[][] from file
                fscanf(fid, "%d", &(A[i][j]));
                // Set Anew[][] = A[][]
                Anew[i][j] = A[i][j];
            }
        }
        fclose(fid);
    }
 
    /*
    * G A M E
    */
    int generation, N=100;
    int di, dj;
    int live_neighbors;
    char outFilename[100];
 
    for (generation=0; generation<N; generation++) {
 
        for (i=0; i<dim; i++) {
            for (j=0; j<dim; j++) {
                  
 
                  //life
                // Find number of live neighbors
                live_neighbors = 0;
                for (di=-1; di<=1; di++) {
                    for (dj=-1; dj<=1; dj++) {
                        if (i+di<0 || i+di>=dim || j+dj<0 || j+dj>=dim || (di==0 && dj==0)) {
                            continue;
                        }
                        live_neighbors += A[i+di][j+dj];
                    }
                }
                      
                /*
                * Life rules:
                */
                if (A[i][j] == 1) {
                    if (live_neighbors < 2) {
                        Anew[i][j] = 0;
                    }
                    else if (live_neighbors == 2 || live_neighbors == 3) {
                        Anew[i][j] = 1;
                    }
                    else if (live_neighbors > 3) {
                        Anew[i][j] = 0;
                    }
                } else {
                    if (live_neighbors == 3) {
                        Anew[i][j] = 1;
                    }
                }
 
            }
        }
 
        /* 
        *   At the end of the generation:
        *   (a) Copy Anew[][] to A[][]
        *   (b) Printf A[][] to file
        */
        sprintf(outFilename, "life_g%03d.dat", generation);
        fid = fopen(outFilename, "w");
        for (i=0; i<dim; i++) {
            for (j=0; j<dim; j++) {
                A[i][j] = Anew[i][j];
                fprintf( fid, "%d ", A[i][j] );
            }
            fprintf( fid, "\n" );
        }
        fclose(fid);
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.12.2015, 05:06
Ответы с готовыми решениями:

Как сделать после сталкновения с хвостом змейки исчезновение жизни после 3 игра заканчивается
Как сделать после сталкновения с хвостом змейки исчезновение жизни после 3 игра заканчивается ...

WMPI - функции коллективного обмена в MPI . Производные типы в MPI
помогите пожалуйста - вот задание: Разработать программу, создающую MPI - тип данных C- структуры...

Контрольная работа по openmp и mpi (Метод Гаусса-Жордана). Сложности с реализацией MPI на С++
Нужна помощь с составлением алгоритма для метода Гаусса-Жордана на С++. Нашёл такой вот код ...

Анекдоты из личной жизни и жизни родственников
Предлагаю публиковать придуманные Вами анекдоты, рожденные на основе реальных событий Вашей жизни и...

0
31.12.2015, 05:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2015, 05:06
Помогаю со студенческими работами здесь

Игра +1 - это современная, набирающая популярность игра на просторах интернета
Игра +1 - это современная, набирающая популярность игра на просторах интернета. Она завлекает всех...

Создать иерархию классов игра – спортивная игра – волейбол
Создать иерархию классов игра – спортивная игра – волейбол. Определить конструкторы, деструктор,...

Создать иерархию классов игра – спортивная игра – волейбол
Создать иерархию классов игра – спортивная игра – волейбол.Определить конструкторы, деструктор,...

Бюджет 4500 гр. Конфигурация работа в Office, AutoCAD, игра Assassin, онлайн игра World of Tanks
Собираю компьютер для сестры. Основные требования: работа в Microsoft Office, AutoCAD, игра...

Игра в загадки. Загадать загадку. Если ответ верен – поздравить пользователя. Затем сообщить, что игра окончена.
Всем привет! Меня зовут VitoScaletta, совсем недавно начал обучаться JS, но очень тяжело в голову...

Игра в «Одиннадцать предметов», игра Баше.
прошу помощи в создании программы! Разработать программную модель следующей игры двух...

Игра летающая птица. Не работает игра
import pygame import random pygame.init() SCREEN = pygame.display.set_mode((500, 750)) #...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru