如何使用 MPI 发送整数数组并计算它们的阶乘?

Posted

技术标签:

【中文标题】如何使用 MPI 发送整数数组并计算它们的阶乘?【英文标题】:How to send an integer array Using MPI and calculate factorial of them? 【发布时间】:2021-04-11 14:04:01 【问题描述】:

假设进程 0 有一个整数数组,我们应该计算所有的阶乘 数组中的元素。修改程序以便将数组发送到计算所有的进程 1 阶乘并将结果返回到进程 0。

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <mpi.h>
    int main (int argc, char ** argv)
    
        int rank, size,code,tag=100;
        int a[10]=1,2,3,4,5,6,7,8,9,10;
        int count,fact = 1,i,j,k;
        MPI_Init (&argc, &argv);    /* starts MPI */
        MPI_Comm_rank (MPI_COMM_WORLD, &rank);  /* get current process id */
      
        if (rank == 0) 
           for ( i = 0; i < 9; ++i)
           
              code=MPI_Send(&a[i],1, MPI_INTEGER,1,tag, MPI_COMM_WORLD);
              code=MPI_Recv(&fact,1, MPI_INTEGER,1,tag, MPI_COMM_WORLD,MPI_STATUSES_IGNORE);
               printf("Process %d,Result=%d\n",rank,fact);
           
         
       else if (rank == 1) 
       
          for (int j = 0; j < 9; ++j)
          
             code=MPI_Recv(&a[j],1, MPI_INTEGER,0,tag, MPI_COMM_WORLD,MPI_STATUSES_IGNORE);
             count = j;
             for ( k = 0; k < count; ++k)
             
                  fact = fact*(j+1);
                  code=MPI_Send(&fact,1, MPI_INTEGER,0,tag, MPI_COMM_WORLD);
             
          
     
      
    
      MPI_Comm_size (MPI_COMM_WORLD, &size);    /* get number of processes */
     
      MPI_Finalize();
     
     
      return 0;
    

【问题讨论】:

【参考方案1】:

您的代码存在一些问题,即MPI_INTEGER 不是有效的 MPI C data type(尽管它在 MPI fortran 中有效),MPI_INT 是。此外,您计算阶乘的方式是假设来自process 0 的元素将始终是来自1 to N 的连续自然数。您不应该假设,也不需要单独发送每个元素,而是执行以下操作:

进程 0:

    使用值创建数组以计算其阶乘; 创建一个数组来存储将由process 1 发送的阶乘; 将整个数组(在1.中创建)发送到process 1等待调用MPI_recv)等待来自进程1的结果。

流程 1:

    创建一个数组来存储将由process 0 发送的值; 等待调用MPI_recv)来自process 0的值; 创建一个数组来存储阶乘; 计算阶乘; 将它们存储在为此目的创建的数组中; 将带有阶乘的数组发送到process 0

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mpi.h>
int main (int argc, char ** argv)
    int rank, size,tag=100;
    MPI_Init (&argc, &argv);  /* starts MPI */
    MPI_Comm_rank (MPI_COMM_WORLD, &rank);    /* get current process id */
  
    if (rank == 0)
    
        int a[10]=1,2,3,4,5,6,7,8,9,10; // the array with the values to calculate the factorial
        int fact[10] = 0; // the array to store the results
        MPI_Send(a, 10, MPI_INT,1,tag, MPI_COMM_WORLD); // the values 
        MPI_Recv(fact, 10, MPI_INT,1,tag, MPI_COMM_WORLD,MPI_STATUSES_IGNORE); // wait for the result 
        for(int i = 0; i < 10; i++) // print the results;
           printf("Process %d,Result=%d\n",rank, fact[i]);
     
    else if (rank == 1) 
     
       int a[10] = 0;
       int fact[10] = 0;
       MPI_Recv(a, 10, MPI_INT,0,tag, MPI_COMM_WORLD,MPI_STATUSES_IGNORE);
       for(int i = 0; i < 10; i++)
           int f = 1;
           for (int k = 1; k <= a[i]; ++k) // Calculate the factorials 
                f *= k; 
           fact[i] = f;
       
       MPI_Send(fact,10, MPI_INT,0,tag, MPI_COMM_WORLD); // send the factorials to process 0
    
    MPI_Comm_size (MPI_COMM_WORLD, &size);    /* get number of processes */
    MPI_Finalize();
    return 0;

输入: 1,2,3,4,5,6,7,8,9,10

输出

Process 0,Result=1
Process 0,Result=2
Process 0,Result=6
Process 0,Result=24
Process 0,Result=120
Process 0,Result=720
Process 0,Result=5040
Process 0,Result=40320
Process 0,Result=362880
Process 0,Result=3628800

【讨论】:

以上是关于如何使用 MPI 发送整数数组并计算它们的阶乘?的主要内容,如果未能解决你的问题,请参考以下文章

在 MPI 和 C 中,如何将结构信息的结构发送到从属进程并接收它们?

如何在 C MPI 中发送指向数组的指针数组

使用 MPI 在 C 中发送二维数组块

MPI 发送带有字节数组和整数的结构

通过 MPI 发送和接收二维数组

C-MPI 发送创建的带有字符数组的 typedef 结构