1

私は9x9の2D配列を持っています。配列に乱数を入力し、配列の最初の 3 行を送信してランク = 1 で処理し、配列の 2 番目の 3 行をランク = 2 で処理し、最後に配列の 3 番目の 3 行を送信して処理しますランク=3。つまり、各プロセスは配列の 3 行を取得します。

プロセスがメイン配列の各行を受け取った後、ルート プロセスから受け取った 3 つの行のヒストグラムを計算します。次に、ヒストグラムをルート プロセスに戻します。3 つのプロセスすべてがこのタスクを実行します。

問題は、rank=3 のプロセスが、ルート プロセスによって送信された行を受信できないことです。私はそれを理解できませんでした。なぜですか?誰かが私のコードを見て、私の問題の解決策を見つけてくれたら、とても感謝しています。

前もって感謝します。

cでMPIを使用しています。ここに私のコードがあります

#include "mpi.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>

int main(int argc, char* argv[])
{
int my_rank;
int p;
int i;
int k;
int m;
int tag=0;
int array[9][9];
int sub_array[3][9];    // 3 rows and 9 columns for each process
int c[20];

MPI_Status status;
//  MPI_Datatype MPI_INT;

MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
MPI_Comm_size(MPI_COMM_WORLD,&p);

//  MPI_Type_contiguous(9,MPI_INT,&MPI_INT);
//  MPI_Type_commit(&MPI_INT);
srand(time(NULL));

for(i=0; i<20 ; i++)
            c[i] = 0;


    if(my_rank == 0)
    {


    for(i=0; i<9 ; i++)

        for(k=0; k<9 ; k++)
        {
                array[i][k] = rand()%20+1;  // fill the array with random numbers from 1 to 20;
        }

        for(i=0; i<9 ; i++)
        {
            printf("\n");
            for(k=0; k<9 ; k++)
        {
                printf("%d ",array[i][k]); // prints the array here
        }
        }

        // here each process will be sent 3 rows of the array;
        for(i=0; i<3 ; i++)
                MPI_Send(&(array[i][0]),9,MPI_INT,1,tag,MPI_COMM_WORLD); // 1st 3 rows of the array are sent to process 1
        for(i=3; i<6 ; i++)
                MPI_Send(&(array[i][0]),9,MPI_INT,2,tag,MPI_COMM_WORLD); // 2nd 3 rows of the array are sent to process 2
        for(i=6; i<9 ; i++)
                MPI_Send(&(array[i][0]),9,MPI_INT,3,tag,MPI_COMM_WORLD); // 3rd 3 rows of the array are sent to process 3

        for (i=1;i<=3;i++)
        MPI_Recv(&sub_array, 9, MPI_INT,i, 0, MPI_COMM_WORLD, &status);  // root receives the subarrays from each node;
    }


if(my_rank != 0)
{
    // for the process with rank=1;
        for(i=0; i<3 ; i++)
        {
            MPI_Recv(&(sub_array[i][0]),9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);

                for(k=0; k<9 ; k++)
                {
                    for(m=0 ; m<20 ; m++)       // here the process with rank=1 calculates the histogram
                    {
                        if(sub_array[i][k] == m)
                            c[m]++;
                    }
                }
        }       

        // for the process with rank=2
        for(i=3; i<6 ; i++)
        {
            MPI_Recv(&(sub_array[i][0]),9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);

                for(k=0; k<9 ; k++)
                {
                    for(m=0 ; m<20 ; m++)  // here the process with rank=2 calculates the histogram
                    {
                        if(sub_array[i][k] == m)
                            c[m]++;
                    }
                }
        }
        // for the process with rank=3
        for(i=6; i<9 ; i++)
        {
            MPI_Recv(&(sub_array[i][0]),9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
            for(k=0; k<9 ; k++)

                {
                    for(m=0 ; m<20 ; m++)   // here the process with rank=3 calculates the histogram
                    {
                        if(sub_array[i][k] == m)
                            c[m]++;
                    }
                }
        }
}




    // here the histogram must be printed.
    for(k=0; k<20 ; k++)
    {
        printf("\n");
        printf("%2d : ",k);
        for(i=0 ; i<c[k] ; i++)
    {
        printf("=");
    }
    }

    MPI_Finalize();
return 0;
}
4

2 に答える 2

1
#include <stdio.h>
#include <conio.h>
#include <time.h>

int main(int argc, char* argv)
{
int my_rank;
int p;
int Array[9];
int localArray[3];
int i;
int k;
int m;
int a[9][9];
int b[10][50];
int c[20];

MPI_Status status;
MPI_Datatype my_type;

MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
MPI_Comm_size(MPI_COMM_WORLD,&p);

MPI_Type_contiguous(9,MPI_INT,&my_type);
MPI_Type_commit(&my_type);
srand(time(NULL));

    for(i=0; i<20 ; i++)
    c[i] = 0;

    if(my_rank == 0)
    {

    for(i=0; i<9 ; i++)
        for(k=0; k<9 ; k++)
        {
                a[i][k] = rand()%20;
        }

        for(i=0; i<9 ; i++)
        {
            printf("\n");
            for(k=0; k<9 ; k++)
        {
                printf("%d ",a[i][k]);
        }
        }

        for(i=0; i<3 ; i++)
                MPI_Send(&(a[i][0]),1,my_type,1,0,MPI_COMM_WORLD);
        for(i=3; i<6 ; i++)
                MPI_Send(&(a[i][0]),1,my_type,2,0,MPI_COMM_WORLD);
        for(i=6; i<9 ; i++)
                MPI_Send(&(a[i][0]),1,my_type,3,0,MPI_COMM_WORLD);
    }


if(my_rank != 0)
{
        for(i=0; i<3 ; i++)
        {
            MPI_Recv(&(b[i][0]),1,my_type,0,0,MPI_COMM_WORLD,&status);
        }
        for(i=0; i<3 ; i++)
            for(k=0; k<9 ; k++)
            {
                for(m=0 ; m<20 ; m++)
                {
                    if(b[i][k] == m)
                        c[m]++;
                }
            }

            printf("\n \n ");
            for(m=0 ; m<20 ; m++)
                printf("%d ",c[m]);





        for(i=3; i<6 ; i++)
        {
            MPI_Recv(&(b[i][0]),1,my_type,0,0,MPI_COMM_WORLD,&status);
        }

        for(i=0; i<3 ; i++)
            for(k=0; k<9 ; k++)
            {
                for(m=0 ; m<20 ; m++)
                {
                    if(b[i][k] == m)
                        c[m]++;
                }
            }

            printf("\n \n ");
            for(m=0 ; m<20 ; m++)
                printf("%d ",c[m]);

        for(i=0; i<3 ; i++)
        {
            MPI_Recv(&(b[i][0]),1,my_type,0,0,MPI_COMM_WORLD,&status);
        }
        for(i=0; i<3 ; i++)
            for(k=0; k<9 ; k++)
            {
                for(m=0 ; m<20 ; m++)
                {
                    if(b[i][k] == m)
                        c[m]++;
                }
            }

            printf("\n \n ");
            for(m=0 ; m<20 ; m++)
                printf("%d ",c[m]);
}





    for(k=0; k<20 ; k++)
    {
        printf("\n");
        printf("%2d : ",k);
        for(i=0 ; i<c[k] ; i++)
    {
        printf("=");
    }
    }

    MPI_Finalize();
 return 0;
}

@Colin DIは上記のコードを編集し、現在は機能していますが、問題は3.processorが受信しないか、0.processorが行を送信できなかったことです。私はそれを達成しませんでした。

于 2012-05-15T15:00:55.617 に答える
1

次のループで:

 // for the process with rank=3
        for(i=6; i<9 ; i++)
        {
            // snip
            for(i=0; i<3 ; i++) // notice the reuse of the var i here!
            //snip

        }

あなたのループでは、 の値を再割り当てしていますi。これはあなたの問題かもしれません。ランク 1 と 2 の proc のループでは、kこのループに別の変数を使用します。

于 2012-05-15T14:48:16.283 に答える