我来寻求我的问题的帮助。
以下整个代码似乎为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
答案 0 :(得分:0)
MPI_Gather()
收集proc root
上的值。如果您希望在任何地方收集值,可以使用MPI_Allgather()
http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Allgather.html
再见,
弗朗西斯