Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MPI未在MPICH v3.3.2上立即发送消息_C_Mpi_Mpich - Fatal编程技术网

MPI未在MPICH v3.3.2上立即发送消息

MPI未在MPICH v3.3.2上立即发送消息,c,mpi,mpich,C,Mpi,Mpich,我正在编写一个并行计算矩阵乘法的程序,我正在使用MPI_Isend函数进行非阻塞通信。以下是主要的并行化逻辑: 主节点将大部分工作发送给不同的工作者 然后它自己做部分工作。同时,它希望工人们已经开始接受他们的工作,并在工作 它通过调用MPI\u Wait然后调用MPI\u Recv来等待工人完成他们的工作 但是,在现实中,工作者只有在主节点调用MPI_Wait时才会收到他们的消息;因此,当主节点执行其分担的工作时,其他节点静止不动。为什么会这样 #包括“helpers.h” #包括 int

我正在编写一个并行计算矩阵乘法的程序,我正在使用
MPI_Isend
函数进行非阻塞通信。以下是主要的并行化逻辑:

  • 主节点将大部分工作发送给不同的工作者
  • 然后它自己做部分工作。同时,它希望工人们已经开始接受他们的工作,并在工作
  • 它通过调用
    MPI\u Wait
    然后调用
    MPI\u Recv
    来等待工人完成他们的工作
但是,在现实中,工作者只有在主节点调用MPI_Wait时才会收到他们的消息;因此,当主节点执行其分担的工作时,其他节点静止不动。为什么会这样

#包括“helpers.h”
#包括
int main(int argc,char const*argv[]{
int m=atoi(argv[1]);
int n=atoi(argv[2]);
int p=atoi(argv[3]);
双启动,已过;
MPI_Init(NULL,NULL);
int世界大小、世界排名、名称;
字符处理器名称[最大处理器名称];
MPI_Comm_大小(MPI_Comm_WORLD和WORLD_大小);
MPI通信等级(MPI通信世界级和世界级);
MPI获取处理器名称(处理器名称和名称);
printf(“来自处理器%s的Hello world,排名%d(共%d个处理器)”,处理器名称,世界排名,世界大小);
float*A=malloc(m*n*sizeof(float));
float*B=malloc(n*p*sizeof(float));
float*C=malloc(m*p*sizeof(float));
float*C_serial=malloc(m*p*sizeof(float));
如果(世界排名==0){
兰达尔(m*n,A);
}else if(世界排名==1){
randarr(n*p,B);
}
MPI_屏障(MPI_通信世界);
start=MPI_Wtime();
//串行乘法
如果(!世界排名){
乘法串行(A、B、C串行、m、n、p);
已用时间=MPI_Wtime()-开始;
printf(“[*]串行乘法:%f秒\n”,已过);
}
//并行乘法
int mpart=m/世界尺寸;
MPI请求ID[(世界大小1)*2];
float*part=malloc(mpart*n*sizeof(float));
float*Cpart=malloc(mpart*p*sizeof(float));
//主节点
如果(!世界排名){
对于(int i=1;i
下面是该程序的一个运行示例:

sumit@HAL9000:~/Coding/parallel/parallel-distributed-assignments/A2$ time make mpinb
mpicc mpib.c -o mpib
mpicc mpinb.c -o mpinb
mpirun -n 4 ./mpinb 6000 32 6000
Hello world from processor HAL9000, rank 0 out of 4 processors
Hello world from processor HAL9000, rank 1 out of 4 processors
Hello world from processor HAL9000, rank 2 out of 4 processors
Hello world from processor HAL9000, rank 3 out of 4 processors
[*] Serial multiplication: 4.700643 seconds
[*] Started sending: 4.700674 seconds
[*] Multiplied: 5.790390 seconds
[*] I'm worker, got work: 5.790726 seconds
[*] I'm worker, got work: 5.790901 seconds
[*] Sending completed: 5.790974 seconds
[*] I'm worker, got work: 5.791019 seconds
[*] Parallel multiplication: 6.920345 seconds
[*] Parallel correctness: 1

real    0m7.175s
user    0m27.699s
sys 0m0.479s

您是否运行了几次,并且其行为是否相同

在MPI_Waitall调用之前,试着告诉程序“rank=0”进行一次重要的暂停(可能是10秒?)暂停。因为我不确定这不是你想要的。我认为这可能是因为通信过程比3 for循环执行时间长,因此工人在proc“rank=0”之后完成工作


PS:我也认为您的printf消息中有2条在代码和exec中不相同(“刚刚发送”和“发送完成”似乎是代码的“开始发送”和“发送完成”?

您的MPI实现没有进度线程,至少有了您正在使用的互连。@GillesGouaillardet您可以在此基础上进行更多扩展,或者链接到任何资源吗?另外,我使用MPICH v3并在本地运行所有内容,因此互连是进程间通信。你能为我介绍一些资源吗,这样我就可以为MPICH启用进度线程了?我刚刚用OpenMPI而不是MPICH尝试了相同的代码,它按预期工作。所以是的,MPICH没有正确的进度线程实现。奇怪的是,假设它是最流行和最广泛使用的MPI实现。出于好奇,您是否尝试过
MPI_Init_thead(…,MPI_THREAD_MULTIPLE,…)
而不是
MPI_Init(…)
?我不熟悉MPICH的内部结构,但这可能会奏效。我确信,通信过程不会比3 for循环长。因为我有这个程序的另一个实现,它使用阻塞调用,
MPI\u Send
,运行速度是这个程序的两倍。你说得对,我在代码中编辑了
printf
消息,但没有发布更新后的输出。