-1
我跟着here的例子,並添加了一些測試代碼,但是當我添加新代碼時出現了一些奇怪的結果。結果如下所示。它掛在這裏,不能繼續下去。MPI_Bcast掛
[0]: Before Bcast, buf is 777
[1]: Before Bcast, buf is 32767
[0]: After Bcast, buf is 777
這是從兩個角度奇怪:
它不會掛斷時的代碼是
if(rank==i) if(i==0)
乳清
buffer[1]
不爲0 BCAST之前。
下面是代碼:
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char** argv) {
int rank;
int buf;
const int root=0;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank == root) {
buf = 777;
}
printf("[%d]: Before Bcast, buf is %d\n", rank, buf);
// newly added
for(int i=0; i<2; i++)
{
if(rank==i)
{
if(i==1)
MPI_Bcast(&buf, 1, MPI_INT, rank, MPI_COMM_WORLD);
}
}
// end newly added
/* everyone calls bcast, data is taken from root and ends up in everyone's buf */
MPI_Bcast(&buf, 1, MPI_INT, root, MPI_COMM_WORLD);
printf("[%d]: After Bcast, buf is %d\n", rank, buf);
MPI_Finalize();
return 0;
}
是我真正想要做的是實現以下功能: 每個處理器上運行的處理的某些部分,然後得到結果後,播放它,其他處理器通過組合接收結果更新他們自己的結果。
這裏是代碼的主要部分(原代碼爲LIBSVM)
struct decision_function
{
double *alpha;
double rho;
};
int gate_no = 2;
int p = 0;
int nr_class = 8;
for(int i=0;i<nr_class;i++)
{
for(int j=i+1;j<nr_class;j++)
{
if(((world_rank==i-2*gate_no*(i/(2*gate_no))) && (i%(2*gate_no) < gate_no))||((world_rank==2*gate_no*(i/(2*gate_no)+1)-i-1)&&(i%(2*gate_no) >= gate_no)))
{
// some process for generating f[p] here
....
MPI_Bcast(f[p].alpha, count[i]+count[j], MPI_DOUBLE, world_rank, MPI_COMM_WORLD);
}
++p;
}
}
但這代碼不起作用,我得到了一些錯誤。
Fatal error in PMPI_Bcast: Other MPI error, error stack:
PMPI_Bcast(1478)......................: MPI_Bcast(buf=0xcc7b40, count=2340, MPI_DOUBLE, root=1, MPI_COMM_WORLD) failed
MPIR_Bcast_impl(1321).................:
MPIR_Bcast_intra(1119)................:
MPIR_Bcast_scatter_ring_allgather(962):
MPIR_Bcast_binomial(154)..............: message sizes do not match across processes in the collective
非常感謝您的回覆。我再次編輯了這個問題。希望它更清楚。 – yuehust 2014-11-05 06:27:07
我仔細閱讀您的意見。現在我終於明白了這個問題。這是因爲所有進程都需要調用'MPI_Bcast'。 [問題發佈](http://stackoverflow.com/questions/14511833/mpi-bcast-in-an-if-statement?rq=1)也幫助我很多。 – yuehust 2014-11-05 07:24:25
運行商業代碼時出現類似錯誤。有沒有可以設置的標誌來延長完成MPI_Bcast所需的時間? – luksmir 2015-06-04 06:08:13