在MPI中广播(共享)一个数组

时间:2014-04-20 20:48:02

标签: c mpi

我正在尝试使用MPI_Bcast()在MPI中的进程之间共享一个字符数组。任何人都可以告诉我在这种情况下必须作为count和datatype传递什么?

阵列:

char * Var;

MPI中的广播功能:

int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm )

1 个答案:

答案 0 :(得分:1)

您希望MPI_Datatype MPI_BYTEint count应为strlen(Var) + 1

以下是解释原因: 对于数据类型,您需要类似char的内容,就像发送MPI_INT传输整数数组一样。这是MPI_BYTE的用途:

  

MPI_BYTE:         这是0到255之间的8位正整数,即一个字节。

至于长度,那必须是数组的大小。如果我理解正确,这可能会根据您发送的字符串的长度而有所不同。因此,您必须先调用strlen(Var)来获取字符串的长度。如

  

strlen()函数计算字符串s的长度,   排除终止空字节(' \ 0')。

您必须为字符串的空字符终止符添加一个字节。

问题:上面的代码可能会导致内存泄漏:您的问题是,MPI_Broadcast的性质是只有一个参与进程知道该消息是传输。因此,只有此过程能够确定所有其他进程都处于正确的count,因为它们无法调用strlen。那么我们能做些什么呢?

  1. 首先通过strlen广播由根处理器确定的字符串长度,然后广播实际字符串
  2. MPI_SendMPI_Recv结合使用,允许您在接收程序中轮询邮件大小。
  3. 我建议使用第二种选择,因为这可以避免不必要的障碍。可以找到关于此主题的好方法here