MPI上的并行数组加法

时间:2018-03-26 13:30:57

标签: c parallel-processing mpi

MPI_Init(&argc, &argv);


    int size,rank,i,*a,*b,*c,N;
    double t1,t2;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    srand(time(NULL)); 



    if(rank==0)
    {
        printf("Input an integer for arrays size\n");
        scanf("%d",&N);
        a = (int*) malloc((N)* sizeof(int));
        b = (int*) malloc((N) * sizeof(int));
        c = (int*) malloc((N)* sizeof(int));
        for(i=0;i<N;i++)
        {
            a[i]=rand()%100+1;
            b[i]=rand()%100+1;
            c[i]=0;


            printf("c[%d]= %d , a[i]= %d ,  b[i] = %d  \n",i, c[i],a[i],b[i]);

        }
    }
    t1=MPI_Wtime();


    MPI_Bcast(&N,1,MPI_INT,0,MPI_COMM_WORLD);

    MPI_Bcast(&a,N,MPI_INT,0,MPI_COMM_WORLD);
    MPI_Bcast(&b,N,MPI_INT,0,MPI_COMM_WORLD);
    MPI_Bcast(&c,N,MPI_INT,0,MPI_COMM_WORLD);

        printf("\n\n\n\n");


    for(i=rank;i<N;i+=size)
    {   
        printf("entered rank %d \n",rank);
        c[i]=a[i]+b[i];
        printf("c[%d]= %d , a[i]= %d ,  b[i] = %d  \n",i, c[i],a[i],b[i]);
    }


    t2=MPI_Wtime();




    if(rank==0)
        printf("time elapsed %.8f \n" ,t2-t1);



MPI_Finalize();

}

我想用MPI Library编写一个并行程序。当我用一个核心运行这个代码没问题。但是,除了核心之外,我遇到了一个运行时错误,如下所示。 0级工作得很好。其他级别不起作用。

1 个答案:

答案 0 :(得分:0)

您需要malloc()所有数组abc 所有等级(例如MPI_Bcast()不能在非根级别上为你做这件事。)

从性能和内存占用的角度来看,您更喜欢MPI_Scatterv()数组,因此可以在不跨越访问的情况下对操作进行矢量化。