Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "mpi.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <string.h>
- #include <math.h>
- #include <time.h>
- #include <cstdio>
- #include <iostream>
- int main(int argc, char* argv[])
- {
- int porog = 1000000;
- using namespace std;
- setlocale(LC_ALL, "Russian");
- int *chisla, *chisla_buf;
- int myrank, size;
- int num_proc;
- int TAG=0;
- double startwtime, endwtime;
- FILE *prchisla;
- MPI_Status status;
- int fl;
- int diapason, ost, start, end;
- int i, j, flag;
- int buf, kol;
- MPI_Init(&argc, &argv); // Инициализируем работу программы MPI
- MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
- // Определяем общее число процессов
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- if (myrank == 0) // Если это главный процесс, то
- {
- fopen_s(&prchisla, "result.txt", "w");
- startwtime = MPI_Wtime();
- diapason = porog / size;
- ost = porog - diapason*size;
- // Главный процесс посылает всем остальным процессам диапазон анализа
- MPI_Bcast(&diapason, 1, MPI_INT, 0, MPI_COMM_WORLD);
- MPI_Barrier(MPI_COMM_WORLD);
- // Ожидаем пока все процессы получат данные
- start = (size - 1)*diapason + 2;
- end = (size*diapason) + ost;
- chisla = (int*)malloc((diapason + ost) * sizeof(int));
- chisla_buf = (int*)malloc(diapason * sizeof(int));
- for (i = 0; i < (diapason + ost); i++)
- chisla[i] = 0;
- for (i = 0; i < diapason; i++)
- chisla_buf[i] = 0;
- kol = 0;
- if (start == 2)
- {
- chisla[kol] = 2;
- kol++;
- start = start + 1;
- }
- for (i = start; i <= end; i++)
- {
- j = 1;
- flag = 1;
- do
- {
- j++;
- if (i % j == 0)
- flag = 0;
- } while ((j < sqrt(i) + 1) && (flag == 1));
- if (flag == 1)
- {
- chisla[kol] = i;
- kol++;
- }
- }
- if (size > 1)
- {
- for (j = 1; j < size; j++)
- {
- // то принимаем данные от каждого из них
- num_proc = j;
- MPI_Recv(chisla_buf, diapason, MPI_INT, num_proc,
- TAG, MPI_COMM_WORLD, &status);
- i = 0;
- while ((i < diapason) && (chisla_buf[i] != 0))
- {
- if (chisla_buf[i] != 0)
- {
- fprintf(prchisla, "%d \n", chisla_buf[i]);
- fflush(prchisla);
- }
- i++;
- }
- }
- }
- i = 0;
- while ((i < (diapason + ost)) && (chisla[i] != 0))
- {
- if (chisla[i] != 0)
- {
- fprintf(prchisla, "%d \n", chisla[i]);
- }
- i++;
- }
- MPI_Barrier(MPI_COMM_WORLD);
- endwtime = MPI_Wtime();
- printf("\ntime = %f\n", endwtime - startwtime);
- printf("\nEnd of analys!\n");
- free(chisla);
- free(chisla_buf);
- fclose(prchisla);
- }
- else
- {
- MPI_Bcast(&diapason, 1, MPI_INT, 0, MPI_COMM_WORLD);
- printf("\nProccess %d get data from main process, diapazon = %d\n", myrank, diapason);
- MPI_Barrier(MPI_COMM_WORLD);
- start = (myrank - 1) * diapason + 2;
- end = (myrank*diapason) + 1;
- chisla = (int *)malloc(diapason * sizeof(int));
- for (i = 0; i < (diapason); i++)
- chisla[i] = 0;
- kol = 0;
- if (start == 2)
- {
- chisla[kol] = 2;
- kol++;
- start++;
- }
- for (i = start; i <= end; i++)
- {
- j = 1;
- flag = 1;
- do
- {
- j++;
- if (i % j == 0)
- flag = 0;
- } while ((j < sqrt(i) + 1) && (flag == 1));
- if (flag == 1)
- {
- chisla[kol] = i;
- kol++;
- }
- }
- MPI_Send(chisla, diapason, MPI_INT, 0, TAG, MPI_COMM_WORLD);
- MPI_Barrier(MPI_COMM_WORLD);
- }
- MPI_Finalize(); // Завершаем работу программы MPI
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement