Java MPI broadcast
Posted
技术标签:
【中文标题】Java MPI broadcast【英文标题】: 【发布时间】:2015-07-05 05:41:59 【问题描述】:刚刚开始使用用于 MPI 的 Java 接口进行并行编程。 只是想知道是否有人可以非常简单地解释广播的工作原理?
我有以下:
if (me ==0) // This is the master process
int bvalue = 4;
MPI.COMM_WORLD.Bcast(bvalue, 0, 4, MPI.INT, 0);
else // The worker processes
MPI.COMM_WORLD.Bcast(bvalue, 0, 4, MPI.INT, 0);
所以我知道工作进程必须调用 bcast 才能接收 bvalue。我将如何在工作部分使用这个值?
如果我这样做:
int workerb = MPI.COMM_WORLD.Bcast(bvalue, 0, 4, MPI.INT, 0);
我得到一个不兼容的类型错误,void 无法转换为 int。
任何帮助将不胜感激。 谢谢, 迈克
【问题讨论】:
【参考方案1】:我相信您可能在这里弄错了参数。对Bcast()
的方法调用具有以下方法签名(取自here):
public void Bcast(java.lang.Object buf, int offset, int count, Datatype type, int root)
第一个参数通常描述一个数组(在这种情况下可能是一个整数数组)。第二个参数描述了广播开始的这个数组的偏移量。第三个参数count
,描述了从偏移量中发送多少元素。最后一个参数描述了发送者的等级(0是主节点)。
您收到该错误是因为Bcast()
方法调用没有返回任何内容(返回void
)。另外,我相信对Bcast
的调用是一个阻塞调用,因此您基本上可以将上面的代码重写为:
int[] bvalue = new int[1];
if (me == 0) //this is the master process
bvalue[0] = 4;
//the master node will broadcast the value '4' and
//workers will block here waiting for the broadcast
//to complete
MPI.COMM_WORLD.Bcast(bvalue, 0, 1, MPI.INT, 0);
//output the contents of bvalue
System.out.println("bvalue is " + bvalue[0]);
我相信这应该会实现您所期望的行为。希望这会有所帮助..
【讨论】:
我已经有一段时间没有清理我的 Java 了,但我相信你需要在所有进程上分配数组,因为主节点不是唯一将使用数组的人 @ 987654329@. 糟糕!忽略了...谢谢!我更新了我的答案以反映这一点 非常感谢您的评论!它解释了很多!不过,我仍然对Bcast
的去向有些迷惑。在 if (me == 0) 块中,我在那里有 Bcast,在工作块中,我有 println(bvalue)
但是,当我运行程序时,它只是在主块到达 Bcast 时挂起。有什么想法吗?再次感谢。
您必须确保主进程和工作进程都在调用 Bcast() 方法,否则您会看到程序挂起。例如,您可以执行类似于我在上面发布的示例的操作,也可以像以前一样在工作块中进行另一个 Bcast 调用。就个人而言,只有一个 MPI 方法调用让我的调试生活更轻松:)以上是关于Java MPI broadcast的主要内容,如果未能解决你的问题,请参考以下文章
OpenMPI:MPI.Init 挂在 Java 中 - 如何调试?