Skip to content

Instantly share code, notes, and snippets.

@zwrss
Created January 5, 2014 18:55
Show Gist options
  • Save zwrss/8272310 to your computer and use it in GitHub Desktop.
Save zwrss/8272310 to your computer and use it in GitHub Desktop.
MPI communication
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <iostream>
#include "mpi.h"
using namespace std;
void master(MPI_Status status, int size) {
MPI_Request sendRequest;
int n = 20;
int numbers[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
int numbersSent = 0;
int numbersReceived = 0;
for(int i = 1; i < size; i++) {
MPI_Isend( &numbers[i - 1], sizeof(int), MPI_INT, i, 5, MPI_COMM_WORLD, &sendRequest);
numbersSent++;
}
while(numbersReceived < n) {
int buf[3];
MPI_Recv( buf, sizeof(int) * 3, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
if(buf[0] > 0) cout << buf[2] << ": pierwsza" << endl;
else cout << buf[2] << ": zlozona" << endl;
numbersReceived++;
if(numbersSent < n) {
MPI_Isend( &numbers[numbersSent], sizeof(int), MPI_INT, buf[1], 5, MPI_COMM_WORLD, &sendRequest);
numbersSent++;
}
}
// Terminate listeners
int terminator = -1;
for(int i = 1; i < size; i++) {
MPI_Send( &terminator, sizeof(int), MPI_INT, i, 5, MPI_COMM_WORLD);
}
}
void slave(MPI_Status status, int rank) {
int number = 0;
while(number != -1) {
MPI_Recv( &number, sizeof(int), MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
if(number == -1) break; // Terminate if -1 received
int buf[3];
buf[0] = 0;
buf[1] = rank;
buf[2] = number;
MPI_Send( buf, sizeof(int) * 3, MPI_INT, 0, 5, MPI_COMM_WORLD);
}
}
int main( int argc, char** argv ){
MPI_Status status;
int rank, size;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
switch(rank) {
case 0:
master(status, size);
break;
default:
slave(status, rank);
break;
}
MPI_Finalize();
return(0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment