ps_homeworks/dn5/server.c_b

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;
}