MPI收集返回的错误值

时间:2014-01-27 22:21:06

标签: parallel-processing mpi

我来寻求我的问题的帮助。

以下整个代码似乎为root进程返回了正确的值,但是对于所有其他进程,返回的值不正确,如-1。#IND00。在我生成数组并广播它们之前,障碍也不起作用,一些过程可以自由地进行。

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

我不知道我哪里出错了。

如果给予任何帮助,我将不胜感激。

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

更新:循环在第二次迭代时崩溃,其值在xNowe的某些索引上计算为:

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 

1 个答案:

答案 0 :(得分:0)

MPI_Gather()收集proc root上的值。如果您希望在任何地方收集值,可以使用MPI_Allgather()

http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Allgather.html

再见,

弗朗西斯