96 lines
1.8 KiB
Plaintext
96 lines
1.8 KiB
Plaintext
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <mpi.h>
|
|
|
|
#define buffsize 650
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
int taskid, ntasks;
|
|
int i;
|
|
int *buff;
|
|
double inittime, totaltime;
|
|
MPI_Request sendrequest, recvrequest;
|
|
int done;
|
|
|
|
MPI_Init(&argc, &argv);
|
|
|
|
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
|
|
MPI_Comm_size(MPI_COMM_WORLD, &ntasks);
|
|
|
|
|
|
buff = (int *)malloc(sizeof(int)*buffsize);
|
|
for (i=0; i<buffsize; i++)
|
|
buff[i] = i;
|
|
MPI_Barrier(MPI_COMM_WORLD);
|
|
|
|
printf("Task %d has started, ntasks = %d\n", taskid, ntasks);
|
|
fflush(stdout);
|
|
|
|
inittime = MPI_Wtime();
|
|
|
|
int size;
|
|
|
|
if(taskid == 0) {
|
|
buff[0] = 0;
|
|
buff[1] = -1;
|
|
printf("Sending master\n");
|
|
MPI_Isend(buff, buffsize, MPI_INT, 1, 0, MPI_COMM_WORLD, &sendrequest);
|
|
}
|
|
|
|
for(int i = 1; i < ntasks; i++)
|
|
{
|
|
if(taskid == i)
|
|
{
|
|
printf("Recieving %d\n", taskid);
|
|
fflush(stdout);
|
|
MPI_Irecv(buff, buffsize, MPI_INT, 0, 0, MPI_COMM_WORLD,&recvrequest);
|
|
MPI_Wait(&sendrequest, MPI_STATUS_IGNORE);
|
|
MPI_Wait(&recvrequest, MPI_STATUS_IGNORE);
|
|
printf("Recieved\n");
|
|
fflush(stdout);
|
|
for (int j = 0; j < buffsize; j++)
|
|
{
|
|
if(buff[j] == -1)
|
|
{
|
|
buff[j] = taskid;
|
|
buff[j + 1] = -1;
|
|
break;
|
|
}
|
|
}
|
|
printf("Sending\n");
|
|
fflush(stdout);
|
|
MPI_Send(buff, buffsize, MPI_INT, i+1, 0, MPI_COMM_WORLD);
|
|
printf("Sent\n");
|
|
fflush(stdout);
|
|
}
|
|
}
|
|
|
|
|
|
if(taskid == 0) {
|
|
printf("Done rec");
|
|
fflush(stdout);
|
|
MPI_Recv(buff, buffsize, MPI_INT, ntasks, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
|
|
printf("Done rec1");
|
|
fflush(stdout);
|
|
}
|
|
|
|
totaltime = MPI_Wtime() - inittime;
|
|
|
|
if (taskid == 0) {
|
|
printf("Cas prenosa: %f s, buffsize: %ld\n", totaltime, sizeof(int)*buffsize);
|
|
for(int i = 0; i < buffsize; i++) {
|
|
if(buff[i] == -1) {
|
|
break;
|
|
}
|
|
printf("%d ", buff[i]);
|
|
}
|
|
}
|
|
|
|
free(buff);
|
|
|
|
MPI_Finalize();
|
|
|
|
return 0;
|
|
}
|