Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // lab2MPI.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <mpi.h>
- #include <iostream>
- #include <vector>
- #define iter_num 1
- #define vec_size 10
- using namespace std;
- void one_proc(int iter)
- {
- vector<double> vec(vec_size);
- vec[0] = vec[(vec_size /2)-1] = vec[vec_size - 1] = 1;
- for (int i = 0; i < iter; i++) {
- for (int j = 1; j < vec_size-1; j++)
- {
- if (j != vec_size/2-1) {
- vec[j] = (vec[j - 1] + vec[j + 1]) / 2;
- }
- }
- }
- for (int i = 0; i < vec.size(); i++)
- {
- cout << vec[i] << " ";
- }
- cout << endl << endl;
- }
- int main(int argc, char **argv)
- {
- int rank, size;
- vector <double> main_vector(vec_size);
- main_vector[0] = main_vector[(vec_size / 2)-1] = main_vector[vec_size - 1] = 1;
- MPI_Init(&argc, &argv);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- if (size == 1 || size==2)
- {
- one_proc(iter_num);
- MPI_Finalize();
- exit(0);
- }
- MPI_Request request;
- MPI_Status status;
- int proc_amount = size - 1;
- int temp_size = ((vec_size % proc_amount) ? (vec_size / proc_amount + 1) : (vec_size / proc_amount));
- vector<double> temp(temp_size);
- if (rank == 0)
- {
- for (int i = 1; i <= proc_amount; i++) {
- temp.assign(main_vector.begin() + (i - 1)*vec_size / proc_amount, main_vector.begin() + (i*vec_size / proc_amount));
- MPI_Isend(&temp[0], temp.size(), MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- }
- }
- else
- {
- temp[temp_size - 1] = -1;
- MPI_Irecv(&temp[0], temp_size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- if (temp[temp_size - 1] == -1)
- {
- temp.pop_back();
- }
- }
- double first, last;
- for (int i = 0; i < iter_num; i++)
- {
- if (rank == 1)
- {
- first = temp[temp.size() - 1];
- MPI_Isend(&first, 1, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- MPI_Irecv(&last, 1, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- temp.push_back(last);
- for (int j = 0; j < temp.size(); j++)
- {
- if (j != 0 && j != temp.size() - 1) {
- if (temp[j] != 1) {
- temp[j] = (temp[j - 1] + temp[j + 1]) / 2;
- }
- }
- }
- temp.pop_back();
- first = temp[temp.size() - 1];
- cout << endl;
- for (int k = 0; k < temp.size(); k++) {
- cout << rank << " " << temp[k] << endl;
- }
- }
- else if (rank > 1 && rank < proc_amount)
- {
- last = temp[0];
- MPI_Isend(&last, 1, MPI_DOUBLE, rank - 1, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- MPI_Irecv(&first, 1, MPI_DOUBLE, rank - 1, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- temp.insert(temp.begin(), first);
- first = temp[temp.size() - 1];
- MPI_Isend(&first, 1, MPI_DOUBLE, rank + 1, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- MPI_Irecv(&last, 1, MPI_DOUBLE, rank + 1, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- temp.push_back(last);
- for (int j = 0; j < temp.size(); j++)
- {
- if (j != 0 && j != temp.size() - 1) {
- if (temp[j] != 1) {
- temp[j] = (temp[j - 1] + temp[j + 1]) / 2;
- }
- }
- }
- temp.erase(temp.begin());
- temp.pop_back();
- cout << endl;
- for (int k = 0; k < temp.size(); k++) {
- cout << rank << " " << temp[k] << endl;
- }
- }
- else if (rank == proc_amount)
- {
- last = temp[0];
- MPI_Isend(&last, 1, MPI_DOUBLE, proc_amount - 1, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- MPI_Irecv(&first, 1, MPI_DOUBLE, proc_amount - 1, 0, MPI_COMM_WORLD, &request);
- MPI_Wait(&request, &status);
- temp.insert(temp.begin(), first);
- for (int j = 0; j < temp.size(); j++)
- {
- if (j != 0 && j != temp.size() - 1) {
- if (temp[j] != 1) {
- temp[j] = (temp[j - 1] + temp[j + 1]) / 2;
- }
- }
- }
- temp.erase(temp.begin());
- cout << endl;
- for (int k = 0; k < temp.size(); k++) {
- cout << rank << " " << temp[k] << endl;
- }
- }
- }
- MPI_Finalize();
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement