Parallel processing MPI聚集返回不正确的值
我是来寻求帮助解决我的问题的 下面的代码似乎为根进程返回了正确的值,但为所有其他进程返回了不正确的值,如-1.#IND00。障碍也不起作用,在我生成阵列并广播它们之前,一些过程会自由地进行 其主要思想是将向量的不同部分放入其他进程中,然后使用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))
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()
在procroot
上收集值。如果希望在任何地方收集值,可以使用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