MPI_Ssend和MPI_Recv的问题,郁闷了我好几天啦

siyang 2007-09-22 11:01:26
#include <pthread.h>
#include <iostream>
#undef SEEK_SET
#undef SEEK_END
#undef SEEK_CUR
#define MPICH_SKIP_MPICXX
#include "mpi.h"
#define INFO_MAX_LEN 128

using namespace std;
void* ExecCmd(void *param);

int numprocs,myid,namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];

void* Listen(void *param)
{
while (1)
{
MPI_Status status;
int n,m;
pthread_t id;
printf("proc %d call MPI_Recv.\n",myid);
MPI_Recv(&n,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
printf("proc %d call MPI_Recv success.\n",myid);
int ret;
m = n;
ret = pthread_create(&id,NULL,ExecCmd,(void*)&m);
}
return NULL;
}

void* ExecCmd(void *param)
{
int *cmd = (int*)param;
int n = *cmd;
int c = 'a';
if (myid == 0)
{
printf("Proc 0 recv cmd from proc %d.\n",*cmd);
MPI_Ssend(&c,1,MPI_INT,n,0,MPI_COMM_WORLD);
fprintf(stderr,"MPI_Ssend %d data,tag=0. in ExecCmd.\n", sizeof(c));
printf("Proc 0 send the cmd to %d.\n",n);
}
else
{
printf("Proc %d Recv cmd from Proc 1.\n",myid);
// MPI_Send(cmd,sizeof(*cmd),MPI_INT,*cmd,0,MPI_COMM_WORLD);
}
return NULL;
}
int main(int argc,char* argv[])
{

/*****MPI环境初始化*****/
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
pthread_t id;
int ret;
ret = pthread_create(&id,NULL,Listen,NULL);
if (myid != 0)
{
MPI_Ssend(&myid,1,MPI_INT,0,0,MPI_COMM_WORLD);
fprintf(stderr,"MPI_Ssend %d data,tag=0. in main func.\n", sizeof(myid));
}
pthread_join(id,NULL);
MPI_Finalize();
/************************************************************************/
return 0;
}

以上是我的代码,装的是MPICH2-1.0.1。

每个进程都创建了一个Listen线程用来接受命令,接受了命令调用ExecCmd执行。

①非0进程向0号进程发送自己的进程编号
②0号进程接受到各进程编号
③0号进程创建执行线程ExecCmd,并把各个进程的编号反馈回给各个进程
问题:
0号进程接受各个进程编号后创建的ExecCmd线程在调用MPI_Ssend时停住,如果改用MPI_Send的话,虽然ExecCmd能够执行完毕,但是其他进程(非0号进程)无法接受到0号进程反馈回来的编号信息。
大家救我啊!
...全文
793 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
donkeymeng 2012-02-27
  • 打赏
  • 举报
回复
您好,我在 mpich2支持的多线程里面 调用MPI_Send/MPI_Recv 总出问题,是不是不支持这样操作呢?
yosoqoo 2011-06-01
  • 打赏
  • 举报
回复
现在的MPICH2支持多线程,安装MPICH2编译时就要把这个开关打开~
xiaotiancd 2010-08-13
  • 打赏
  • 举报
回复
可以用openMP和 mpi一起用,可解决你的问题。另外请问下该怎么用mpi发送c++的object?
liangshaotong 2008-12-01
  • 打赏
  • 举报
回复
我现在也碰到跟你相同的问题,好烦啊!
siyang 2007-09-24
  • 打赏
  • 举报
回复
mpi没有要求要支持线程,不能假定mpi是支持线程操作的。目前的mpi还没有支持线程,看来俺要改一改代码了
yevv 2007-09-22
  • 打赏
  • 举报
回复
MPI是啥我都不知道 Mark

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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