Parallel processing MPI聚集返回不正确的值

Parallel processing MPI聚集返回不正确的值,parallel-processing,mpi,Parallel Processing,Mpi,我是来寻求帮助解决我的问题的 下面的代码似乎为根进程返回了正确的值,但为所有其他进程返回了不正确的值,如-1.#IND00。障碍也不起作用,在我生成阵列并广播它们之前,一些过程会自由地进行 其主要思想是将向量的不同部分放入其他进程中,然后使用MPI_聚集将它们粘合到一个变量中 我不知道我哪里出错了 我会感谢你给我的任何帮助 double *xNowe = calloc(n, sizeof(double)); double *vec = calloc(n/size, sizeof(double))

我是来寻求帮助解决我的问题的

下面的代码似乎为根进程返回了正确的值,但为所有其他进程返回了不正确的值,如-1.#IND00。障碍也不起作用,在我生成阵列并广播它们之前,一些过程会自由地进行

其主要思想是将向量的不同部分放入其他进程中,然后使用MPI_聚集将它们粘合到一个变量中

我不知道我哪里出错了

我会感谢你给我的任何帮助

double *xNowe = calloc(n, sizeof(double));
double *vec = calloc(n/size, sizeof(double));

MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(A, n*n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(b, n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(x0, n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
while(delta > granica)
{
    ii++;
    for(i = mystart; i < myend; i++)
    {
        vec[i - mystart] = b[i];
        for(j = 0; j < n; j++)
        {
            if(i != j)
            {
                vec[i - mystart] -= A[i][j] * x0[j];
            }
        }
        vec[i - mystart] = vec[i - mystart] / A[i][i];
        if(rank > 0)
            printf("\n%f", vec[i - mystart]);
        }
        printf("1: %d, 10: %d, 50: %d, 110: %d, 200: %d, 300: %d, 400: %d",xNowe[1],xNowe[10],xNowe[110],xNowe[200],xNowe[300],xNowe[400]);
        MPI_Allgather(vec, n/size, MPI_DOUBLE, xNowe, n/size, MPI_DOUBLE, MPI_COMM_WORLD);

        if(rank == 0)
        {
            delta = 0;
            for(i = 0; i < n; i++)
            {
                delta = delta + ((xNowe[i] - x0[i] > 0) ? (xNowe[i] - x0[i]) : (-(xNowe[i] - x0[i])));
            }

            //x0 = xNowe; nie dzialalo
            for(i = 0; i < n; i++)
            {
                x0[i] = xNowe[i];
            }
        }
        MPI_Bcast(&delta, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
        MPI_Bcast(x0, n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
    }
}
MPI\u Gather()
在proc
root
上收集值。如果希望在任何地方收集值,可以使用
MPI\u Allgather()

再见


弗朗西斯

好吧,这仍然不能解决问题。似乎屏障不起作用是主要问题。
mpi\u聚集
聚集到任何一个程序中它要聚集到的进程上。调用中的第7个参数指定了这是什么进程。@HighPerformanceMark:很抱歉,我不清楚@用户1794121:如何分配矩阵
A
?您是否介意尝试将
&A[0][0]
给第一个
MPI_Bast()
?您的答案不清楚,但第一句话不正确。似乎广播开始使用&x0[0]和&b[0]。它们似乎只是不与矩阵一起工作。(目前正在尝试通过指定索引将矩阵转换为向量。到目前为止似乎有效。您希望这些障碍做什么?它们在这里似乎没有任何作用。感谢您编辑我的代码,使其看起来更合适。这些障碍应该使进程等待接收广播值。老实说,我不知道是什么在可能是一个问题。在调用
mpi\u bcast
后,您不需要设置障碍使进程等待。这些是集体调用,指定通信器中的所有进程都参与其中。可以观察到的行为应该是,进程同时参与,并且所有进程都在c之前完成参与继续下一个可执行语句。不过,我不认为存在不必要的障碍是问题的根源。很高兴知道,谢谢。似乎有些值没有传递或传递得很糟糕。
1: 1204749721, 10: -1085549499, 50: -1034011523, 110: 1063725393, 200: -17690801
07, 300: -1083408896, 400: -5847835510
1: 0, 10: -524288, 50: 0, 110: -524288, 200: 0, 300: -524288, 400: 0