567
社区成员




#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define DEBUG 0
void *computingFun(void *ptr)
{
int rank, nprocs;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
if(!DEBUG) printf("proc:%d Sending Thread Start\n",rank);
unsigned long long data[3];
int root = 0;
char sendFinishTag = 1;
char *recvFinishTag;
if(rank == 0) recvFinishTag = new char [nprocs];
MPI_Gather(&sendFinishTag, 1, MPI_CHAR, recvFinishTag, 1, MPI_CHAR, root, MPI_COMM_WORLD);
if(rank==0)
{
int sum = 0;
for(int i=0; i<nprocs; i++)
sum += recvFinishTag[i];
printf("---------------------------%d\n", sum);
if(sum != nprocs)
{
printf("Gather Tags Error\n");
exit(0);
}
}
if(rank==0)
{
data[0] = rank;
data[2] = 10;
for(int i=0;i<nprocs;i++)
{
data[1] = i;
MPI_Send(data, 3, MPI_LONG_LONG_INT, i, 0, MPI_COMM_WORLD);
// if(!DEBUG) printf("|proc:%d Sending finishMsg to -[%d]-\n",rank, i);
}
}
/*
for(int i=0;i<nprocs;i++)
{
if(rank == i) continue;
data[0] = rank;
data[1] = i;
data[2] = 10; //finish msg flag
MPI_Send(data, 3, MPI_LONG_LONG_INT, i, 0, MPI_COMM_WORLD);
if(!DEBUG) printf("|proc:%d Sending finishMsg to -[%d]-\n",rank, i);
}
*/
}
void *serviceFun(void *ptr)
{
int rank, nprocs;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
if(!DEBUG) printf("proc:%d Recving Thread Start\n",rank);
char *msgFlagArray = new char [nprocs];
for(int i=0;i<nprocs;i++) msgFlagArray[i] = 0;
MPI_Status stats;
unsigned long long srcNodeID, dstNodeID, msgType;
unsigned long long data[3];
while(1)
{
MPI_Recv(data, 3, MPI_LONG_LONG_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &stats);
if(!DEBUG) printf("%d %d %d\n", data[0], data[1], data[2]);
srcNodeID = data[0];
dstNodeID = data[1];
msgType = data[2];
if(msgType == 10) //Last FinishMsg Was Received
{
break;
/*
msgFlagArray[data[0]] = 1;
int FinishFlag = 1;
for(int i=0; i < nprocs; i++)
if(i!=rank && msgFlagArray[i]==0) FinishFlag = 0;
if(FinishFlag) break;
else continue;
*/ }
}
}
void simplifyDistNodeGraph()
{
pthread_t ComputingThd, ServiceThd;
pthread_attr_t attr;
void *thdStatus;
pthread_attr_init(&attr );
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&ComputingThd, &attr, computingFun, (void*) NULL);
pthread_create(&ServiceThd, &attr, serviceFun, (void*) NULL);
pthread_join(ComputingThd, &thdStatus);
pthread_join(ServiceThd, &thdStatus);
pthread_attr_destroy(&attr);
}
int main(int argc, char* argv[])
{
int rank;
MPI_Offset size;
int rc;
int nprocs;
MPI_File cFile;
MPI_Status status;
int provided, flag, claimed;
MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
if(provided != MPI_THREAD_MULTIPLE)
{
printf("MPI do not Support Multiple thread\n");
exit(0);
}
// MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
simplifyDistNodeGraph();
MPI_Finalize();
return 0;
}