我正在尝试使用 MPI_Bcast() 在 MPI 中的进程之间共享字符数组。谁能告诉我在这种情况下必须作为计数和数据类型传递什么?
数组:
char * Var;
MPI中的广播功能:
int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm )
最佳答案
您希望 MPI_Datatype MPI_BYTE
和 int 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
。那么我们能做些什么呢?
- 首先通过
strlen
广播根处理器确定的字符串长度,然后广播实际的字符串 - 将
MPI_Send
与MPI_Recv
结合使用,允许您轮询接收进程上的消息大小。
我建议使用第二种选择,因为这样可以避免不必要的障碍。关于这个主题的一个很好的操作方法可以在 here 找到。 。
关于c - 在 MPI 中广播(共享)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23187427/