假设您存储在lines 数组中的字符串可能具有不同的大小,您可以先广播每个字符串大小的 int 数组,然后分别广播每个字符串,
/* Create an Array with length of each line
Broadcast it from process 0 */
int lin_siz[linesCount];
if (p_rank == 0)
for (i=0; i < linesCount; i++)
lin_siz[i] = strlen(lines[i])+1;
MPI_Bcast(&lin_siz, linesCount, MPI_INT, 0, MPI_COMM_WORLD);
/* Broadcast each line */
for (i=0; i < linesCount; i++)
MPI_Bcast(&lines[i], lin_siz[i], MPI_CHAR, 0, MPI_COMM_WORLD);
MPI_Bcast 只能广播内存中连续的元素——在这种情况下,int 数组的大小为lin_siz,每一行存储在lines 中。这可能不是一个非常优雅的解决方案,而且肯定有更好的解决方案,但它确实有效。
用下面的数组测试过
char **lines;
lines = malloc(linesCount * sizeof(char*));
if (p_rank == 0){
for (i=0; i<linesCount-2; i++)
lines[i] = "This is a test.";
lines[i++] = "More testing.";
lines[i++] = "Even more..";
}
p_rank 是使用MPI_Comm_rank(MPI_COMM_WORLD, &p_rank) 获得的标准处理器等级。并在最后成功打印为
/* Print */
printf("Process rank %d:\n", p_rank);
for (i=0; i < linesCount; i++)
printf("%s\n", lines[i]);
如果您在实施我的答案时遇到问题,我可以发布整个测试用例。