MPI多线程通信问题
我写了一个程序,这个程序分主节点和非主节点两类,所有非主节点都开一个监听线程,监听主节点发送的信息。这主要是为了实现实时的中断机制。但是,不管我怎么写,都会是下面这种状况——在没有线程的情况下通信正常,加上线程就会出现死锁或者invalid data type =: 16777216错误。
不管用MPI_Reduce还是单纯的用MPI_Ssend都会出现这种问题,是不是MPI不支持这种通信模式呢???下面是一个类似模型的东西。哪位大神知道这是什么问题,我又该怎么实现主节点中断退出的同时,通知各个非主节点一同退出的机制呢????
void *calcListenThread(void *param);
int main(int argc, char **argv)
{
int provided, i, j, rank, size;
MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Status status;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_t id;
if(rank != 0)
{
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&id, &attr, calcListenThread, 0);
}
int iminoff = rank + 1, imaxoff = rank + 2;
int resultmin, resultmax;
int cipall = 10, nt = 1000;
float **result = (float **)malloc(sizeof(float *) * cipall);
float **tmp = (float **)malloc(sizeof(float *) * cipall);
for(i = 0; i < cipall; i++)
{
result[i] = (float *)malloc(sizeof(float) * nt);
tmp[i] = (float *)malloc(sizeof(float) * nt);
memset(result[i], 0, sizeof(float) * nt);
}
for(i = 0; i < cipall; i++)
{
for(j = 0; j < nt; j++)
{
tmp[i][j] = 5;
}
}
//求出各节点上最小的iminoff
MPI_Reduce(&iminoff, &resultmin, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);
//求出各节点上最大的imaxoff
MPI_Reduce(&imaxoff, &resultmax, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
//求出各个节点上所有tmp的累加值
for(i = 0; i < cipall; i++)
{
MPI_Barrer(MPI_COMM_WORLD);
MPI_Reduce(tmp[i], result[i], nt, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD);
MPI_Barrer(MPI_COMM_WORLD);
}
pthread_attr_destory(&attr);
……
MPI_Finalize();
return 0;
}
void *calcListenThread(void *param)
{
MPI_Status status;
while(1)
{
MPI_Prode(0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
if(status.MPI_TAG = 0)
{
……
}
else if(status.MPI_TAG = 1)
{
……
}
else
……
}
}