我正在尝试使用MPI_Bcast()在MPI中的进程之间共享一个字符数组。任何人都可以告诉我在这种情况下必须作为count和datatype传递什么?
阵列:
char * Var;
MPI中的广播功能:
int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm )
答案 0 :(得分:1)
您希望MPI_Datatype MPI_BYTE
和int count
应为strlen(Var) + 1
以下是解释原因:
对于数据类型,您需要类似char
的内容,就像发送MPI_INT
传输整数数组一样。这是MPI_BYTE
的用途:
MPI_BYTE: 这是0到255之间的8位正整数,即一个字节。
至于长度,那必须是数组的大小。如果我理解正确,这可能会根据您发送的字符串的长度而有所不同。因此,您必须先调用strlen(Var)
来获取字符串的长度。如
strlen()函数计算字符串s的长度, 排除终止空字节(' \ 0')。
您必须为字符串的空字符终止符添加一个字节。
问题:上面的代码可能会导致内存泄漏:您的问题是,MPI_Broadcast
的性质是只有一个参与进程知道该消息是传输。因此,只有此过程能够确定所有其他进程都处于正确的count
,因为它们无法调用strlen
。那么我们能做些什么呢?
strlen
广播由根处理器确定的字符串长度,然后广播实际字符串MPI_Send
与MPI_Recv
结合使用,允许您在接收程序中轮询邮件大小。我建议使用第二种选择,因为这可以避免不必要的障碍。可以找到关于此主题的好方法here。