Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <mpi.h>
  3. using namespace std;
  4.  
  5. int main(int argc, char *argv[]) {
  6. int rank, size, *recv;
  7.  
  8. int arr[] = {1, 2, 3, 4, 10, 6, 7, 8, 9};
  9. int n = sizeof(arr)/sizeof(int);
  10.  
  11. if (n > 0) {
  12. MPI_Status status;
  13.  
  14. MPI_Init(&argc, &argv);
  15. MPI_Comm_size(MPI_COMM_WORLD, &size);
  16. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  17.  
  18. if (rank == 0) {
  19. for (int i = 1; i < size; i++) {
  20. int start = i*n/size; // c какого по какой отдаем i-му процессу
  21. int end = (i+1)*n/size;
  22. MPI_Send(&arr[start], end-start, MPI_INT, i, 0, MPI_COMM_WORLD); // отдаем
  23. }
  24. }
  25.  
  26. int start = rank*n/size; //оставшееся для 0 потока
  27. int end = (rank+1)*n/size;
  28. int m = end-start;
  29.  
  30. recv = new int[m];
  31.  
  32. if (rank != 0) {
  33. MPI_Recv(recv, m, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); // все процессы кроме 0 принимают от 0 и сразу же отдают
  34. MPI_Send(recv, m, MPI_INT, 0, 1, MPI_COMM_WORLD);
  35. }
  36.  
  37. if (rank == 0) {
  38. int *r = new int[n];
  39. for (int i = 1; i < size; i++) {
  40. int startr = i*n/size; //с какого по какой принимаем и записываем в массим r
  41. int endr = (i+1)*n/size;
  42. MPI_Recv(&r[startr], endr-startr, MPI_INT, i, 1, MPI_COMM_WORLD, &status);// принимаем собсно
  43. }
  44. for (int j = 0; j < n/size; j++) {
  45. r[j] = arr[j]; // оставшийся кусок массива у 0 процесса ( его ж тип не передавали)
  46. }
  47. for (int i = 0; i < n; i++) {
  48. cout<<r[i]<<" "; // вывод
  49. }
  50. cout<<endl;
  51. }
  52.  
  53. MPI_Finalize();
  54. }
  55.  
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement