c - 在 MPI 中广播(共享)数组

标签 c mpi

我正在尝试使用 MPI_Bcast() 在 MPI 中的进程之间共享字符数组。谁能告诉我在这种情况下必须作为计数和数据类型传递什么?

数组:

char * Var;

MPI中的广播功能:

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

最佳答案

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

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

MPI_BYTE: This is an 8-bit positive integer betwee 0 and 255, i.e., a byte.

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

The strlen() function calculates the length of the string s, excluding the terminating null byte ('\0').

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

问题:上述代码可能会导致内存泄漏:您的问题是,它在于 MPI_Broadcast 的性质,只有一个参与进程知道正在传输的消息。因此,只有这个进程能够确定正确的count,所有其他进程都陷入困境,因为它们没有任何东西可以调用strlen。那么我们能做些什么呢?

  1. 首先通过strlen广播根处理器确定的字符串长度,然后广播实际的字符串
  2. MPI_SendMPI_Recv 结合使用,允许您轮询接收进程上的消息大小。

我建议使用第二种选择,因为这样可以避免不必要的障碍。关于这个主题的一个很好的操作方法可以在 here 找到。 。

关于c - 在 MPI 中广播(共享)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23187427/

相关文章:

c++ - C/C++ 优化检查以查看之前是否已经运行过函数

c - 将字符串地址解析为小端

c - 从 strtok 或 strtok_r 崩溃返回的打印 token

c - 从 MPI_Recv 接收到的标签存储在 MPI 中的哪里?

multithreading - 对 MPI_Barrier 的调用是否会影响 MPI 进程中的每个线程?

c - 用 C 中的字符串替换整数

c - linux如何同步抢占计数

c - 具有集体功能的 MPI 死锁

c - MPI_Finalize 和断言?

fortran - Isend/Irecv 不起作用,但 Send/Recv 起作用