【问题标题】:MPI: Values after scattering are corruptedMPI:散射后的值已损坏
【发布时间】:2021-01-03 02:03:24
【问题描述】:

我只想用进程 0 创建一个具有随机值的矩阵。 创建它后,我将值分散到不同的过程中。 我有问题,我收到损坏的值,例如

1980714952

32716

-672521120

-672521856

21858

-310078720

21858

0

0

如何分散进程0创建的矩阵?

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

#define N 3

int main(int argc, char** argv)
{
    
    int rank;
    int size;
    
    int aa[N];
    int a[N][N];
    
    MPI_Init (&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    
    if (rank = 0)
    {
        srand(time(0));
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {

                    a[i][j] = (rand() % 5);
            }
        }
        

    }
    
    MPI_Scatter(a, N*N/size, MPI_INT, aa, N*N/size, MPI_INT,0,MPI_COMM_WORLD);

    for (int x = 0; x < N; x++)
    {

            printf("%d\n", aa[x]);  
    }
        
        
    

    MPI_Finalize();


}


float maxValue(float* array, int _size)
{
    float v = 0.0;
    
    for (int i = 0; i < _size; i++)
    {
        if (array[i] >= v)
        {
            v = array[i];
        }   
    }
    
    return v;
} 

【问题讨论】:

  • 你保证N*N/size &lt;= N 吗?
  • 如何保证 N*N/size
  • 如果我删除了等级 0 的 if 条件,值似乎没问题。

标签: c matrix mpi


【解决方案1】:

这是因为N*N/size 定义。您将N 定义为3,如果进程数超过3,假设进程数为4,那么N*N/Size 将是9/4,因此值将是2。所以2 元素只会被rank 0 分散到所有进程中。结果,最后,所有进程都将打印N(此处为3)值,但2 值仅从等级0 接收,第三个将是垃圾值。同样,此行为发生在其他数量大于N 的进程上。

您可以通过 a[i][j] = (rand() % 5); 将其更改为 a[i][j] = i; 并从进程数为 3 开始进行测试。它将按预期工作。如果您增加进程的大小,您会看到垃圾值将与输出一起打印。

if (rank = 0) 也应该是(rank == 0)

回答评论中的问题:

要将N (x,y) 值发送到P 进程,更改将是。

    #define N 9 // this value must be divisible by P number of processes, because scatter is used for distributing uniform size. for 9 processes, the N can be any multiple of 9
    int aa[2*N/size]; // the receiving process only needs N/size * 2 values
    int a[N][2]; // since 2 values for each N
    MPI_Scatter(a, N*2/size, MPI_INT, aa, N*2/size, MPI_INT,0,MPI_COMM_WORLD);
    for (int x = 0; x < N*2/size; x++) // each processes print its local values
      {
        printf("rank %d, %d\n", rank,aa[x]);
      }

简而言之:要使用scatterP 进程之间平均分配一对N (x,y) 值,N 应该可以被P 整除。否则你必须使用scatterv

【讨论】:

  • 如果我想将 xy 值分配给所有 9 个进程,必须选择哪个大小?
  • 因此,如果您想在 P 个进程中分配 N (x,y) 个值中的 n 个,我要做的是,首先我将定义 N(例如:18),然后我声明数组使用 int a[N][2] (我使用 2,因为我想成对分配它(x,y)),在我定义数组值的循环内,在第二个循环中,我将使用条件 j
  • 谢谢你,j23。我还尝试了 MPI 分散和聚集。由于考试的练习,我必须找到一种更好的方法来分散和收集 3D 矩阵。我还在 2 小时前发布了另一个与我必须理解的练习更相关的问题:stackoverflow.com/questions/63919764/…。除了几个 cmets 之外,另一个问题仍未得到解答。
猜你喜欢
  • 2015-01-30
  • 2014-08-27
  • 2014-07-06
  • 2012-04-28
  • 1970-01-01
  • 2016-06-23
  • 2011-05-14
  • 2011-09-17
  • 2016-03-19
相关资源
最近更新 更多