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的主要内容,如果未能解决你的问题,请参考以下文章

在java中的main之外初始化MPI

从 java 运行本机 MPI 代码

OpenMPI:MPI.Init 挂在 Java 中 - 如何调试?

发送/接收 MPI-Fortran-Java

从 JNI 返回 MPI::Request[] 类型并访问 Java 中的 Request 元素

MPI Java矩阵乘法错误