如何使用C语言在MPI中调用相同等级?

D P.

我正在尝试学习MPI编程,并编写了以下程序。它添加了整行数组并输出总和。在等级0(或进程0)处,它将调用其所有从属等级进行计算。我只想使用其他两个从属等级/进程来执行此操作。每当我尝试两次调用相同的等级(如下面的代码所示)时,我的代码就会挂在中间而无法执行。如果我不两次调用相同的等级,代码将正常工作

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
        MPI_Init(&argc, &argv);
        int world_rank;
        MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
        int world_size;
        MPI_Comm_size(MPI_COMM_WORLD, &world_size);
        int tag2 = 1;       
        int arr[30] = {0};

        MPI_Request request;
        MPI_Status status;

        printf ("\n--Current Rank: %d\n", world_rank);
        int index;
        int source = 0;
        int dest;
        if (world_rank == 0)
        {
            int i;

            printf("* Rank 0 excecuting\n");
            index = 0;
            dest = 1;
            for ( i = 0; i < 30; i++ )
            {
                arr[ i ] = i + 1; 
            }           
            MPI_Send(&arr[0], 30, MPI_INT, dest, tag2, MPI_COMM_WORLD); 

            index = 0;
            dest = 2;
            for ( i = 0; i < 30; i++ )
            {
                arr[ i ] = 0; 
            }
            MPI_Send(&arr[0], 30, MPI_INT, dest, tag2, MPI_COMM_WORLD);         

            index = 0;
            dest = 2; //Problem happens here when I try to call the same destination(or rank 2) twice
            //If I change this dest value to 3 and run using: mpirun -np 4 test, this code will work correctly
            for ( i = 0; i < 30; i++ )
            {
                arr[ i ] = 1; 
            }
            MPI_Send(&arr[0], 30, MPI_INT, dest, tag2, MPI_COMM_WORLD);
        }
        else 
        {
            int sum = 0;
            int i;
            MPI_Irecv(&arr[0], 30, MPI_INT, source, tag2, MPI_COMM_WORLD, &request);
            MPI_Wait (&request, &status);
            for(i = 0; i<30; i++)
            {   
                sum = arr[i]+sum;
            }
            printf("\nSum is: %d at rank: %d\n", sum, world_rank);
        }       

        MPI_Finalize();
}

使用时的结果:mpirun -np 3测试

--Current Rank: 2

Sum is: 0 at rank: 2

--Current Rank: 0
* Rank 0 excecuting

--Current Rank: 1

Sum is: 524800 at rank: 1
                  //Program hangs here and wouldn't show sum of 30 

请让我知道我怎么能两次叫相同的等级。例如,如果我只有两个可以调用的从属进程。如果可能,请举例说明

克拉丽莎·G。

在MPI中,每个进程执行相同的代码,并且在执行操作时,主要通过检查if / else语句中的等级来区分不同的进程。等级为0的主进程正在执行3个发送:发送到进程1,然后是两个发送至进程2。从属进程每个仅执行一个接收,这意味着等级1接收其第一条消息,等级2接收其第一条消息。当您MPI_Send在进程0上调用第三个消息时,此后没有,也没有任何从属等待接收消息,因为从属已完成执行else块。当主机等待发送最终消息时,程序被阻塞。

为了解决这个问题,您必须确保等级2的从属执行两次接收,方法是仅为该进程添加一个循环,或者仅对该进程重复(因此,使用if(world_rank == 2)检查)代码块

        sum = 0; //resetting sum
        MPI_Irecv(&arr[0], 1024, MPI_INT, source, tag2, MPI_COMM_WORLD, &request);
        MPI_Wait (&request, &status);
        for(i = 0; i<1024; i++)
        {   
            sum = arr[i]+sum;
        }
        printf("\nSum is: %d at rank: %d\n", sum, world_rank); 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用PHP为具有相同分数的用户分配相同等级?

在Linux中如何使用C语言编写“写”系统调用?

如何在MPI中传递2D数组并使用C语言创建动态标签值?

如何强制等级函数将不同的值分配给相同等级的行?

c# - 如何使用任务在c#中并行运行n次调用相同的方法?

如何从Go语言调用此C函数(使用Cgo工具)

如何使用JavaScript或C语言调用键盘键

如何摆脱C语言中“调用与源表达式相同”的警告?

使用 MPI 为每个等级创建数组

如何使用C语言在MPI中从通信器A的一个进程向通信器B的所有进程广播消息?

从 per_grades 中选择具有相同等级的两行中的一行

在C ++中运行MPI时调用函数

如何使用javascript中的参数多次调用相同的函数?

如何在Codeigniter中从数据库调用语言并从语言库消息中使用foreach调用?

如何使用GHCJS从Java语言调用Haskell

使用C语言中的函数调用函数

MPI:在C语言中使用MPI_Isend发送消息并通过MPI_Irecv接收消息

如何在Lubuntu中安装,选择和使用相同语言的不同键盘布局?

如何使用Scala在Spark中滑动窗口等级?

如何使用switch在Java上的数组中添加等级

MySQL-为具有相同分数的用户分配相同等级

如何从拆分通信器获取原始mpi等级

MPI等级确定

Matmul不同等级

持续列出同等级

如何在不使用 MPI_Send 和 MPI_Recv 例程的情况下仅将元素广播到某些等级

在熊猫中如何计算等级

使用MPI的C程序中的分段错误

如果SQL Server中有2个具有相同等级的学生,则计算分数