MPI多线程通信问题

jasperlei 2012-06-11 09:54:49
我写了一个程序,这个程序分主节点和非主节点两类,所有非主节点都开一个监听线程,监听主节点发送的信息。这主要是为了实现实时的中断机制。但是,不管我怎么写,都会是下面这种状况——在没有线程的情况下通信正常,加上线程就会出现死锁或者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
……
}
}
...全文
1607 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu-yonggang 2014-09-28
  • 打赏
  • 举报
回复
求指导,我在0号进程创建线程中收其它进程的数据出错,检查有无消息是程序崩溃了,mpi-iprobe()出错
jasperlei 2012-06-11
  • 打赏
  • 举报
回复
自己先顶一下……
jasperlei 2012-06-11
  • 打赏
  • 举报
回复
没人知道吗???
jasperlei 2012-06-11
  • 打赏
  • 举报
回复
顶上去,求大神指导。。。

2,408

社区成员

发帖
与我相关
我的任务
社区描述
高性能计算
社区管理员
  • 高性能计算社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧