Advertisement
bkit4s0

[lab3_1.c XLSS] don't debug yet

Mar 6th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.33 KB | None | 0 0
  1. #include "mpi.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define ARRAYSIZE 1000
  5. #define MASTER 0
  6.  
  7. int data1[ARRAYSIZE];
  8. int data2[ARRAYSIZE];
  9.  
  10. int update(int*,int*,int);
  11. int main(int argc, char const *argv[]) {
  12.     int numtasks, taskid, chunksize, rc,i;
  13.     MPI_Status status;
  14.  
  15.     MPI_Init(&argc,&argv);
  16.     MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
  17.     MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
  18.     chunksize = ARRAYSIZE/numtasks;
  19.  
  20.     if(taskid==MASTER) {
  21.         // Init vetor
  22.         for (i = 0; i < ARRAYSIZE; ++i) {
  23.             data1[i]=i;
  24.             data2[i]=i;
  25.         }
  26.         /* Send each task its portion of the array - master keeps 1st part */
  27.         offset = chunksize;
  28.         for (i = 0; i < numtasks; ++i) {
  29.             MPI_Send(&offset,1,MPI_INT,dest,NULL,MPI_COMM_WORLD);
  30.             MPI_Send(&data1[offset],1,MPI_INT,dest,NULL,MPI_COMM_WORLD);
  31.             MPI_Send(&data2[offset],1,MPI_INT,dest,NULL,MPI_COMM_WORLD);
  32.             offset+=offset+chunksize;
  33.         }
  34.         /* Master does its part of the work */
  35.         offset = 0;
  36.         mysum = update(offset, chunksize, taskid);
  37.  
  38.         /* Wait to receive results from each task */
  39.         for (i = 0; i < numtasks; ++i) {
  40.             source = i;
  41.             MPI_Recv(&offset, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, &status);
  42.             MPI_Recv(&data[offset], chunksize, MPI_FLOAT, source, tag2,
  43.                 MPI_COMM_WORLD, &status);
  44.         }
  45.          /* Get final sum and print sample results */  
  46.         MPI_Reduce(&mysum, &sum, 1, MPI_FLOAT, MPI_SUM, MASTER, MPI_COMM_WORLD);
  47.         printf("*** Final sum= %d ***\n",sum);
  48.     }   /* end of master section */
  49.     if (taskid > MASTER) {
  50.           /* Receive my portion of array from the master task */
  51.           source = MASTER;
  52.           MPI_Recv(&offset, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, &status);
  53.           MPI_Recv(&data[offset], chunksize, MPI_FLOAT, source, tag2,
  54.             MPI_COMM_WORLD, &status);
  55.  
  56.           mysum = update(offset, chunksize, taskid);
  57.  
  58.           /* Send my results back to the master task */
  59.           dest = MASTER;
  60.           MPI_Send(&offset, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD);
  61.           MPI_Send(&data[offset], chunksize, MPI_FLOAT, MASTER, tag2, MPI_COMM_WORLD);
  62.  
  63.           MPI_Reduce(&mysum, &sum, 1, MPI_FLOAT, MPI_SUM, MASTER, MPI_COMM_WORLD);
  64.     } /* end of non-master */
  65.  
  66.     return 0;
  67. }
  68. int update(int offset,int chunk, int taskid)
  69. {
  70.     int i;
  71.     int mysum = 0;
  72.     for (i = offset; i < offset+ chunk; ++i)
  73.     {
  74.         mysum+=data1[i]*data2[i]
  75.     }
  76.     printf("Task %d mysum = %d\n",myid,mysum);
  77.     return mysum;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement