我正在尝试在2D数组中播放我的第一行。这是代码:
double *chunkPtr = malloc(sizeof(double) * columns);
if (rank == 0) {
chunkPtr = &chunk[0][0];
}
MPI_Bcast(chunkPtr, columns, MPI_DOUBLE, 0, MPI_COMM_WORLD);
chunk 是一个2D双数组(double ** chunk),而 columns 是一行中的双精度数。
这是我的问题:当我从排名为0的流程(就像之前提供的代码一样)进行广播时,其他流程无法获得广播的双重播放阵列。相反,它们会在每个索引上得到一个值等于0.0的数组。
这是我在数组中打印值时得到的输出,当我用3个进程运行我的程序时:
>>>>>>>>RANK IS 0
6.807000 5.249000 0.073000 3.658000 8.930000 1.272000 7.544000 0.878000 1.000000
>>>>>>>>RANK IS 1
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
>>>>>>>>RANK IS 2
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
注意进程0如何在其数组中包含实际值,而进程1和2只有0值。
当我更改程序以使排名为1的进程广播其行时,一切都正常运行:
代码:
if (rank == 1) {
chunkPtr = &chunk[0][0];
}
MPI_Bcast(chunkPtr, columns, MPI_DOUBLE, 1, MPI_COMM_WORLD);
输出:
>>>>>>>>RANK IS 0
0.979000 9.149000 6.579000 8.821000 1.967000 0.672000 1.393000 9.336000 5.000000
>>>>>>>>RANK IS 1
0.979000 9.149000 6.579000 8.821000 1.967000 0.672000 1.393000 9.336000 5.000000
>>>>>>>>RANK IS 2
0.979000 9.149000 6.579000 8.821000 1.967000 0.672000 1.393000 9.336000 5.000000
我做错了什么?
答案 0 :(得分:2)
原来我的代码中有额外的MP_Bcast,搞乱了整个程序。
解决方案:确保所有bcast都设置良好!