【问题标题】:Parallel Array Addition on MPIMPI 上的并行阵列加法
【发布时间】:2018-09-04 16:06:18
【问题描述】:
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 库编写一个并行程序。当我只用一个核心运行这段代码时没问题。但是除了核心之外,我遇到了一个运行时错误,如下所示。等级 0 运行良好。其他行列不工作。

【问题讨论】:

  • ========================================== ===========================================您的一个申请程序终止错误= PID 2860 在 Mustafa 运行 = 退出代码:139 = 清理剩余进程 = 您可以忽略以下清理消息 ========================== ==================================================== ======= 您的应用程序因退出字符串而终止:分段错误(信号 11) 这通常是指您的应用程序出现问题。请查看常见问题页面以获取调试建议
  • 错误情况发生在源代码的哪一行?
  • 这一行:for(i=rank;i&lt;N;i+=size) 看起来很可疑。当 i 用于索引数组时,为什么要按大小增加它?
  • 排名 0 以外的循环在 for 循环中不起作用。 Rank 0 运行良好。当排名 1 进入 for 循环时,我遇到了错误的终止
  • 对于 ecample n=10 尺寸 4;它将计算排名 0 => 0,4,8 排名 1=> 1,5,9 排名 2=> 2,6,10 排名 3=> 3,7

标签: c parallel-processing mpi


【解决方案1】:

你需要malloc()你所有的数组abc所有行列上(例如MPI_Bcast()在非root行列上不适合你) .

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

【讨论】:

猜你喜欢
  • 2022-01-11
  • 2014-06-17
  • 2010-12-03
  • 2013-12-23
  • 2018-09-08
  • 2017-10-30
  • 1970-01-01
  • 2021-12-20
  • 2015-06-14
相关资源
最近更新 更多