Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <mpi.h>
- using namespace std;
- int main(int argc, char *argv[]) {
- int rank, size, *recv;
- int arr[] = {1, 2, 3, 4, 10, 6, 7, 8, 9};
- int n = sizeof(arr)/sizeof(int);
- if (n > 0) {
- MPI_Status status;
- MPI_Init(&argc, &argv);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- if (rank == 0) {
- for (int i = 1; i < size; i++) {
- int start = i*n/size; // c какого по какой отдаем i-му процессу
- int end = (i+1)*n/size;
- MPI_Send(&arr[start], end-start, MPI_INT, i, 0, MPI_COMM_WORLD); // отдаем
- }
- }
- int start = rank*n/size; //оставшееся для 0 потока
- int end = (rank+1)*n/size;
- int m = end-start;
- recv = new int[m];
- if (rank != 0) {
- MPI_Recv(recv, m, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); // все процессы кроме 0 принимают от 0 и сразу же отдают
- MPI_Send(recv, m, MPI_INT, 0, 1, MPI_COMM_WORLD);
- }
- if (rank == 0) {
- int *r = new int[n];
- for (int i = 1; i < size; i++) {
- int startr = i*n/size; //с какого по какой принимаем и записываем в массим r
- int endr = (i+1)*n/size;
- MPI_Recv(&r[startr], endr-startr, MPI_INT, i, 1, MPI_COMM_WORLD, &status);// принимаем собсно
- }
- for (int j = 0; j < n/size; j++) {
- r[j] = arr[j]; // оставшийся кусок массива у 0 процесса ( его ж тип не передавали)
- }
- for (int i = 0; i < n; i++) {
- cout<<r[i]<<" "; // вывод
- }
- cout<<endl;
- }
- MPI_Finalize();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement