Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.26 KB | None | 0 0
  1. /***************************************/
  2. /*************LAB 1 MPI*****************/
  3. /***************************************/
  4. #include <mpi.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #define M 3
  9. #define N 15
  10.  
  11. int main( int argc, char *argv[] ){
  12.     MPI_Init( &argc, &argv );
  13.     int rank = 0;
  14.     int i;
  15.     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
  16.     srand (time(NULL) + rank);
  17.     double startwtime, endwtime;
  18.     int *p_send, *p_recv;
  19.  
  20.     p_send = (int*) malloc(sizeof(int) * N);
  21.     p_recv = (int*) malloc(sizeof(int) * N);
  22.  
  23.     startwtime = MPI_Wtime();
  24.  
  25.     printf("\nRank %i send: ", rank);
  26.     for (i = 0; i < N; i++) {
  27.         p_send[i] = rand() % 10;
  28.         printf("%i ", p_send[i]);
  29.     }
  30.     printf("\n");
  31.    
  32.     MPI_Alltoall(p_send, M, MPI_INT, p_recv, M, MPI_INT, MPI_COMM_WORLD );
  33.  
  34.     printf("\nRank %i receive:\n", rank);
  35.     for (i = 0; i < N; i++) {
  36.         printf("%i ", p_recv[i]);
  37.     }
  38.  
  39.     endwtime = MPI_Wtime();
  40.  
  41.     printf("\ntime = %f\n", endwtime - startwtime);
  42.     printf("\n");
  43.  
  44.     MPI_Finalize();
  45.    
  46.     return 0;
  47. }
  48.  
  49. /***************************************/
  50. /*************LAB 2 MPI*****************/
  51. /***************************************/
  52. #include <stdio.h>
  53. #include <stdlib.h>
  54. #include <time.h>
  55. #include <mpi.h>
  56.  
  57. #define ROOT    0
  58. #define M       10
  59. #define N       3
  60. #define RAND_RANGE 10
  61. #define ABS(x) ((x < 0) ? -(x) : (x))
  62.  
  63. int main( int argc, char *argv[])
  64. {
  65.     int myid;
  66.     int numprocs;
  67.     int send_array[M];
  68.     int *recv_buf;
  69.     int i;
  70.     double startwtime, endwtime;
  71.     /* Инициализация библиотеки */
  72.     srand(time(NULL));
  73.  
  74.     MPI_Init(&argc, &argv);
  75.     /* Получаем общее количество запущенных процессов */
  76.     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  77.  
  78.     /* Получаем порядковый номер текущего процесса */
  79.     MPI_Comm_rank(MPI_COMM_WORLD, &myid);
  80.  
  81.     if (myid == ROOT) {
  82.           recv_buf = (int *) malloc(M * sizeof(int));
  83.     }
  84.  
  85.     for (i = 0; i < M; i++) {
  86.         send_array[i] = (int) ABS((myid + 1) * rand() % RAND_RANGE);
  87.     }
  88.     int rank = 0;
  89.     while (rank < numprocs) {
  90.         if (myid == rank) {
  91.             printf("\nrank = %d\t", myid);
  92.             for (i = 0; i < M; i++) {
  93.                 printf ("%3d", send_array[i]);
  94.             }
  95.             fflush (stdout);
  96.         }
  97.         rank ++;
  98.         MPI_Barrier (MPI_COMM_WORLD);
  99.     }
  100.  
  101.     if (myid == ROOT){
  102.           /* Засекаем время начала вычисления */
  103.         startwtime = MPI_Wtime();
  104.     }
  105.  
  106.     MPI_Reduce(send_array, recv_buf, M, MPI_INT, MPI_MAX, ROOT, MPI_COMM_WORLD);
  107.     if (myid == ROOT) {
  108.           /*Засекаем время окончания вычисления */
  109.         endwtime = MPI_Wtime();
  110.         printf("\n\nCollected data from processes:\n");
  111.         for (i = 0; i < M; i++){
  112.             printf("%6d", recv_buf[i]);
  113.         }
  114.         printf("\n");
  115.         printf("time = %f\n", endwtime - startwtime);
  116.     }
  117.  
  118.     MPI_Finalize();     /* Нормальное закрытие библиотеки */
  119.  
  120.     return 0;
  121. }
  122.  
  123. /***************************************/
  124. /*************LAB 3 MPI*****************/
  125. /***************************************/
  126. #include <stdio.h>
  127. #include <stdlib.h>
  128. #include <time.h>
  129. #include <mpi.h>
  130.  
  131. #define ROOT 0
  132. #define M    5
  133. #define N    8
  134. #define RAND_RANGE 100
  135. #define SWAP(A, B) { int t = A; A = B; B = t; }
  136.  
  137. void bubblesort(int *a, int n);
  138.  
  139. int main( int argc, char *argv[])
  140. {
  141.     int myid;
  142.     int numprocs;
  143.     int *arr;
  144.     arr = (int *) malloc(N * M * sizeof(int));
  145.     int *arr2;
  146.     arr2 = (int *) malloc(N * M * sizeof(int));
  147.  
  148.     //long arr[N][M];
  149.     int subarr[M];
  150.     int subarr2[N];
  151.     int buf[N];
  152.  
  153.     int i, j;
  154.     int *ranks;
  155.     double startwtime, endwtime;
  156.     MPI_Group orig_group, new_group;
  157.     MPI_Comm new_comm;
  158.     /* Инициализация библиотеки */
  159.     MPI_Init(&argc, &argv);
  160.     /* Получаем общее количество запущенных процессов */
  161.     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  162.  
  163.     /* Получаем порядковый номер текущего процесса */
  164.     MPI_Comm_rank(MPI_COMM_WORLD, &myid);
  165.     MPI_Comm_group(MPI_COMM_WORLD, &orig_group);
  166.  
  167.     if (myid == ROOT) {
  168.         srand(time(NULL));
  169.         for(i = 0; i < N; ++i) {
  170.             for(j = 0; j < M; ++j) {
  171.                 //arr[i][j] = rand() % RAND_RANGE;
  172.                 arr2[i * M + j] = rand() % RAND_RANGE;
  173.             }
  174.         }
  175.         printf("Initial arr[%d][%d]:\n", N, M);
  176.         for(i = 0; i < N; i++){
  177.             for(j = 0; j < M; j++){
  178.                 //printf("%4ld", arr[i][j]);
  179.                 printf("%4d", arr2[i * M + j]);
  180.             }
  181.             printf("\n");
  182.         }
  183.         for(i = 0; i < N; ++i) {
  184.             for(j = 0; j < M; ++j) {
  185.                 arr[j * N + i] = arr2[i * M + j];
  186.             }
  187.         }
  188.     }
  189.    
  190.     //transponirovanie
  191.  
  192.     if (myid == ROOT){
  193.         /* Засекаем время начала вычисления */
  194.         startwtime = MPI_Wtime();
  195.     }
  196.     /*
  197.     if(N == numprocs) {
  198.         MPI_Scatter(arr2, M, MPI_LONG, subarr, M, MPI_LONG, ROOT, MPI_COMM_WORLD);
  199.         bubblesort(subarr, M);
  200.         MPI_Gather(subarr, M, MPI_LONG, arr2, M, MPI_LONG, ROOT, MPI_COMM_WORLD);
  201.     }
  202.     if(N < numprocs) {
  203.         ranks = (int *) malloc(N * sizeof(int));
  204.         for(i = 0; i < N; i++) {
  205.             ranks[i] = i;
  206.         }
  207.         MPI_Group_incl(orig_group, N, ranks, &new_group);
  208.         MPI_Comm_create(MPI_COMM_WORLD, new_group, &new_comm);
  209.  
  210.         if (myid < N) {
  211.             MPI_Scatter(arr2, M, MPI_LONG, subarr, M, MPI_LONG, ROOT, new_comm);
  212.             bubblesort(subarr, M);
  213.             MPI_Gather(subarr, M, MPI_LONG, arr2, M, MPI_LONG, ROOT, new_comm);
  214.         }
  215.     }
  216.  
  217.     if(N > numprocs) {
  218.         for(i = 0; i < N / numprocs; i++) {
  219.             MPI_Scatter(arr2 + (i * M * numprocs), M, MPI_LONG, subarr, M, MPI_LONG, ROOT, MPI_COMM_WORLD);
  220.             bubblesort(subarr, M);
  221.             MPI_Gather(subarr, M, MPI_LONG, arr2 + (i * M * numprocs), M, MPI_LONG, ROOT, MPI_COMM_WORLD);
  222.             MPI_Barrier(MPI_COMM_WORLD);
  223.         }
  224.         int tail = N - numprocs * i;
  225.         ranks = (int *) malloc(tail * sizeof(int));
  226.         for(i = 0; i < tail; i++) {
  227.             ranks[i] = i;
  228.         }
  229.         MPI_Group_incl(orig_group, tail, ranks, &new_group);
  230.         MPI_Comm_create(MPI_COMM_WORLD, new_group, &new_comm);
  231.  
  232.         if (myid < tail) {
  233.             MPI_Scatter(arr2 + ((N - tail) * M), M, MPI_LONG, subarr, M, MPI_LONG, ROOT, new_comm);
  234.             bubblesort(subarr, M);
  235.             MPI_Gather(subarr, M, MPI_LONG, arr2 + ((N - tail) * M), M, MPI_LONG, ROOT, new_comm);
  236.         }
  237.  
  238.     }*/
  239.     if(M == numprocs) {
  240.         MPI_Scatter(arr, N, MPI_INT, subarr2, N, MPI_INT, ROOT, MPI_COMM_WORLD);
  241.         bubblesort(subarr2, N);
  242.         MPI_Gather(subarr2, N, MPI_INT, arr, N, MPI_INT, ROOT, MPI_COMM_WORLD);
  243.     }
  244.     if(M < numprocs) {
  245.         ranks = (int *) malloc(M * sizeof(int));
  246.         for(i = 0; i < M; i++) {
  247.             ranks[i] = i;
  248.         }
  249.         MPI_Group_incl(orig_group, M, ranks, &new_group);
  250.         MPI_Comm_create(MPI_COMM_WORLD, new_group, &new_comm);
  251.  
  252.         if (myid < M) {
  253.             MPI_Scatter(arr, N, MPI_INT, subarr2, N, MPI_INT, ROOT, new_comm);
  254.             bubblesort(subarr2, N);
  255.             MPI_Gather(subarr2, N, MPI_INT, arr, N, MPI_INT, ROOT, new_comm);
  256.         }
  257.     }
  258.  
  259.     if(M > numprocs) {
  260.         for(i = 0; i < M / numprocs; i++) {
  261.             MPI_Scatter(arr + (i * N * numprocs), N, MPI_INT, subarr2, N, MPI_INT, ROOT, MPI_COMM_WORLD);
  262.             bubblesort(subarr2, N);
  263.             MPI_Gather(subarr2, N, MPI_INT, arr + (i * N * numprocs), N, MPI_INT, ROOT, MPI_COMM_WORLD);
  264.             MPI_Barrier(MPI_COMM_WORLD);
  265.         }
  266.         int tail = M - numprocs * i;
  267.         ranks = (int *) malloc(tail * sizeof(int));
  268.         for(i = 0; i < tail; i++) {
  269.             ranks[i] = i;
  270.         }
  271.         MPI_Group_incl(orig_group, tail, ranks, &new_group);
  272.         MPI_Comm_create(MPI_COMM_WORLD, new_group, &new_comm);
  273.  
  274.         if (myid < tail) {
  275.             MPI_Scatter(arr + ((M - tail) * N), N, MPI_INT, subarr2, N, MPI_INT, ROOT, new_comm);
  276.             bubblesort(subarr2, N);
  277.             MPI_Gather(subarr2, N, MPI_INT, arr + ((M - tail) * N), N, MPI_INT, ROOT, new_comm);
  278.         }
  279.  
  280.     }
  281.    
  282.     if (myid == ROOT) {
  283.         /*Засекаем время окончания вычисления */
  284.         endwtime = MPI_Wtime();
  285.         printf("\nSorted arr[%d][%d]:\n", N, M);
  286.         for (i = 0; i < N; i++){
  287.             for (j = 0; j < M; j++){
  288.                 //printf("%4ld", arr[i][j]);
  289.                 //printf("%4ld", arr2[i * M + j]);
  290.                 printf("%4d", arr[j * N + i]);
  291.             }
  292.             printf("\n");
  293.         }
  294.         printf("time = %f\n", endwtime - startwtime);
  295.     }
  296.  
  297.     MPI_Finalize();
  298.     return 0;
  299. }
  300.  
  301. void bubblesort(int *a, int n) {
  302.     int i, j;
  303.     for (i = 0; i < n; ++i) {
  304.         for(j = 1; j < n - i; ++j) {
  305.             if(a[j - 1] < a[j]) {
  306.                 SWAP(a[j - 1], a[j]);
  307.             }
  308.         }
  309.     }
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement