4

MPIで並列プログラミングを勉強するつもりでした。そして、私はいくつかのエラーを持っています

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


int main(int argc, char** argv)
{
    int procNum, procRank;
    int m,n;
    int sumProc = 0, sumAll = 0;
    int** arr;
    MPI_Status status;

    MPI_Init ( &argc, &argv );

    MPI_Comm_size ( MPI_COMM_WORLD, &procNum ); 
    MPI_Comm_rank ( MPI_COMM_WORLD, &procRank );

    if (procRank == 0)
    {   
        printf("Type the array size \n");
        scanf("%i %i", &m, &n); 
    }
    MPI_Bcast(&m, 1, MPI_INT, 0, MPI_COMM_WORLD);
    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

    arr = new int*[m];
    for (int i = 0; i < m; i++)
        arr[i] = new int[n];

    if (procRank == 0)
    {
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                    arr[i][j] = rand() % 30;
                    printf("%i ", arr[i][j]);
            }
            printf("\n");
        }
    }

    MPI_Bcast(&arr[0][0], m*n, MPI_INT, 0, MPI_COMM_WORLD);

    for (int i = procRank; i < n; i += procNum)
        for (int j = 0; j < m; j++)
            sumProc += arr[j][i];

    MPI_Reduce(&sumProc,&sumAll,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);

    if (procRank == 0)
    {
        printf("sumAll = %i", sumAll);
    }

    delete *arr;

    MPI_Finalize();
    return 0;
}

2次元配列を他のプロセスに渡そうとしていますが、チェックアウトすると間違った配列になります。このようなもの:

Original array
11 17 4
10 29 4
18 18 22

Array which camed
11 17 4
26 0 0
28 0 0

それは何の問題ですか?MPI_Bcast に問題がある可能性があります

PS私が追加しました

for (int i = 0; i < m; i++)
    MPI_Bcast(arr[i], n, MPI_INT, 0, MPI_COMM_WORLD);

それ以外の

MPI_Bcast(&arr[0][0], m*n, MPI_INT, 0, MPI_COMM_WORLD);

それは私の質問を解決しました

4

1 に答える 1

3

ここ

arr = new int*[m];
for (int i = 0; i < m; i++)
    arr[i] = new int[n];

最初にポインターの配列を作成し、次にそれぞれに対して通常の int 配列を作成して、2D 配列を作成します。この方法を使用すると、すべての配列a[i]が各n要素のサイズになりますが、メモリ内で連続しているとは限りません。

ただし、後で

MPI_Bcast(&arr[0][0], m*n, MPI_INT, 0, MPI_COMM_WORLD);

すべての配列がメモリ内で連続していると仮定します。そうでないため、異なる値が得られます。

于 2013-09-27T11:34:33.367 に答える