【问题标题】:Calculating histogram of a 2 dimensional array in Parallel并行计算二维数组的直方图
【发布时间】:2012-05-15 14:37:10
【问题描述】:

我有一个 9x9 二维数组。我用随机数填充数组,然后发送数组的第 3 行以 rank=1 处理,数组的第 2 3 行以 rank=2 处理,最后发送数组的第 3 3 行以处理排名=3。我的意思是每个进程将获得 3 行数组。

进程接收到主数组的各行后,会计算从根进程接收到的3行的直方图。然后将直方图返回到根进程。所有 3 个进程都会执行此任务。

问题是rank=3的进程无法接收根进程发送的行。我想不通为什么? 如果有人查看我的代码并为我的问题找到解决方案,我将不胜感激。

提前致谢。

我将 MPI 与 c 一起使用。这是我的代码

#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;
}

【问题讨论】:

    标签: parallel-processing mpi


    【解决方案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 D 我编辑了上面的代码,它现在可以工作,但问题是 3.processor 没有接收或 0.processor 无法发送行。我没有做到这一点。

    【讨论】:

      【解决方案2】:

      在以下循环中:

       // 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 的 procs 的循环,您为此循环使用不同的变量 k

      【讨论】:

      • 我按照你说的编辑了我的代码,但它仍然不起作用。顺便谢谢。
      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      相关资源
      最近更新 更多