为什么这个MPI程序不能输出超过2个处理器的更多信息?

  发布于 2022-12-18 20:39

这个MPI程序用C语言编写.当我输入2作为处理器数时,输出如下:

P:0 Got data from processor 1 
P:0 Got 100 elements 
P:0 value[5]=5.000000 

但是当我输入3个或更多处理器时,程序输出

P:0 Got data from processor 1 
P:0 Got 100 elements 
P:0 value[5]=5.000000 

然后它停滞不前,没有别的东西被打印出来.我必须用[ctrl] + [c]退出程序.我不知道为什么节目会停滞不前.我很欣赏一些暗示或良好的方向.

这是代码:

#include 
#include 
#include 

/* Run with two processes */
int main(int argc, char *argv[]) {

        int rank, i, count;
        float data[100],value[200];

        MPI_Status status;
        MPI_Init(&argc,&argv);
        MPI_Comm_rank(MPI_COMM_WORLD,&rank);

        if(rank==1) {

                for(i=0;i<100;++i) data[i]=i;
                MPI_Send(data,100,MPI_FLOAT,0,55,MPI_COMM_WORLD);

        } else {

                MPI_Recv(value,200,MPI_FLOAT,MPI_ANY_SOURCE,55,MPI_COMM_WORLD,&status);
                printf("P:%d Got data from processor %d \n",rank, status.MPI_SOURCE);
                MPI_Get_count(&status,MPI_FLOAT,&count);
                printf("P:%d Got %d elements \n",rank,count);
                printf("P:%d value[5]=%f \n",rank,value[5]);

        }
        MPI_Finalize();
}

antonio.. 5

因为您只将数据发送到rank == 0带有进程的进程rank == 1.这就是为什么它适用于2个进程(0和1).对于更多进程,具有等级2,3,4,5 ....的进程将进入该else块并等待未发送的数据.这就是为什么他们停止执行(等待永远不会发送的数据).您应该使用等级1的进程将数据发送到所有其他进程,使用单个for循环封装发送操作并将for循环迭代器作为MPI_Send调用中的目标等级.

1 个回答
  • 因为您只将数据发送到rank == 0带有进程的进程rank == 1.这就是为什么它适用于2个进程(0和1).对于更多进程,具有等级2,3,4,5 ....的进程将进入该else块并等待未发送的数据.这就是为什么他们停止执行(等待永远不会发送的数据).您应该使用等级1的进程将数据发送到所有其他进程,使用单个for循环封装发送操作并将for循环迭代器作为MPI_Send调用中的目标等级.

    2022-12-18 20:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有