Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "mpi.h"
- #include <stdio.h>
- #include <stdlib.h>
- #define ARRAYSIZE 1000
- #define MASTER 0
- int data1[ARRAYSIZE];
- int data2[ARRAYSIZE];
- int update(int*,int*,int);
- int main(int argc, char const *argv[]) {
- int numtasks, taskid, chunksize, rc,i;
- MPI_Status status;
- MPI_Init(&argc,&argv);
- MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
- MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
- chunksize = ARRAYSIZE/numtasks;
- if(taskid==MASTER) {
- // Init vetor
- for (i = 0; i < ARRAYSIZE; ++i) {
- data1[i]=i;
- data2[i]=i;
- }
- /* Send each task its portion of the array - master keeps 1st part */
- offset = chunksize;
- for (i = 0; i < numtasks; ++i) {
- MPI_Send(&offset,1,MPI_INT,dest,NULL,MPI_COMM_WORLD);
- MPI_Send(&data1[offset],1,MPI_INT,dest,NULL,MPI_COMM_WORLD);
- MPI_Send(&data2[offset],1,MPI_INT,dest,NULL,MPI_COMM_WORLD);
- offset+=offset+chunksize;
- }
- /* Master does its part of the work */
- offset = 0;
- mysum = update(offset, chunksize, taskid);
- /* Wait to receive results from each task */
- for (i = 0; i < numtasks; ++i) {
- source = i;
- MPI_Recv(&offset, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, &status);
- MPI_Recv(&data[offset], chunksize, MPI_FLOAT, source, tag2,
- MPI_COMM_WORLD, &status);
- }
- /* Get final sum and print sample results */
- MPI_Reduce(&mysum, &sum, 1, MPI_FLOAT, MPI_SUM, MASTER, MPI_COMM_WORLD);
- printf("*** Final sum= %d ***\n",sum);
- } /* end of master section */
- if (taskid > MASTER) {
- /* Receive my portion of array from the master task */
- source = MASTER;
- MPI_Recv(&offset, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, &status);
- MPI_Recv(&data[offset], chunksize, MPI_FLOAT, source, tag2,
- MPI_COMM_WORLD, &status);
- mysum = update(offset, chunksize, taskid);
- /* Send my results back to the master task */
- dest = MASTER;
- MPI_Send(&offset, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD);
- MPI_Send(&data[offset], chunksize, MPI_FLOAT, MASTER, tag2, MPI_COMM_WORLD);
- MPI_Reduce(&mysum, &sum, 1, MPI_FLOAT, MPI_SUM, MASTER, MPI_COMM_WORLD);
- } /* end of non-master */
- return 0;
- }
- int update(int offset,int chunk, int taskid)
- {
- int i;
- int mysum = 0;
- for (i = offset; i < offset+ chunk; ++i)
- {
- mysum+=data1[i]*data2[i]
- }
- printf("Task %d mysum = %d\n",myid,mysum);
- return mysum;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement