在何处初始化数组,然后将其分散。MPI_散射

在何处初始化数组,然后将其分散。MPI_散射,mpi,Mpi,我需要使用MPI_散点将数组块发送到所有进程,然后获得所有元素的总和。我应该在哪里初始化数组来分散它?根级 若我在根列组上初始化数组,那个么其他列组就不会得到它们的数据。另外,我可以为每个人初始化数组(超出if(rank==root)…else),但这意味着,我多次创建数组 #include <stdio.h> #include <stdlib.h> #include <mpi.h> #include <iostream> #include <

我需要使用MPI_散点将数组块发送到所有进程,然后获得所有元素的总和。我应该在哪里初始化数组来分散它?根级

若我在根列组上初始化数组,那个么其他列组就不会得到它们的数据。另外,我可以为每个人初始化数组(超出
if(rank==root)…else
),但这意味着,我多次创建数组

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

using namespace std;

int main(int argc, char* argv[])
{
    int size;
    int rank;

    srand(time(NULL));

    MPI_Init(&argc, &argv);

    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    int arr_size = size * 2;
    int block = arr_size / (size);

    int* B = new int[block];

    if (rank == 0)
    {
        int* A = new int[arr_size];

        cout << "generated array: " << endl;
        for (int i = 0; i < arr_size; i++)
        {
            A[i] = rand() % 100;
            cout << A[i] << " ";
        }
        cout << endl;

        MPI_Scatter(A, block, MPI_INT, B, block, MPI_INT, 0, MPI_COMM_WORLD);       
    }

    cout << "process " << rank << " received: " << endl;
    for (int i = 0; i < block; i++)
    {
        cout << B[i] << " ";
    }
    cout << endl;

    int local_sum = 0;
    for (int i = 0; i < block; i++)
    {
        local_sum += B[i];
    }
    cout << "sum in process " << rank << " = " << local_sum << endl;
    cout << endl;

    int global_sum;
    MPI_Reduce(&local_sum, &global_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

    if (rank == 0)
    {
        cout << "sum = " << global_sum << endl;
    }

    MPI_Finalize();
    return 0;
}
  • MPI\u Scatter()
    是一个集合操作,因此必须由所有列组调用

  • 声明
    int*A=NULL在所有列组上,仅在列组0上分配和填充
  • int*A=NULL;
    int*B=新的int[block];
    如果(秩==0)
    {
    A=新的整数[arr_size];
    
    cout散布的定义是从根秩分发数据,因此这是您的数据应该初始化的地方。请发布一条消息,因为错误可能出现在代码的其他部分(例如,
    array\u size
    initialized)中@GillesGouaillardet我现在添加了可复制的代码
    MPI\u散布()
    是一个集合操作,因此必须由所有列组调用。目前,它仅在列组
    0
    上调用,这是问题的根本原因。@GillesGouaillardet ok,但我应该在哪里初始化数组,以免在每个进程中再次分配内存?在所有列组上声明
    int*a=NULL;
    ,并且仅在allo等级为零的类别和填充。
    process 1 received:
    process 3 received:
    -842150451 -842150451
    -842150451 -842150451
    sum in process 1 = -1684300902
    sum in process 3 = -1684300902
    
    
    process 2 received:
    -842150451 -842150451
    sum in process 2 = -1684300902
    
    process 0 received:
    4 9
    sum in process 0 = 13
    
    sum = -757935397