MPI广播字符串数组

时间:2017-12-06 20:28:33

标签: c arrays string mpi openmpi

是否可以广播定义为

的字符串数组
char **lines;
lines = malloc(512 * sizeof(char*));

我试过了

MPI_Bcast(lines, linesCount, MPI_BYTE, 0, MPI_COMM_WORLD);

MPI_Bcast(lines, linesCount, MPI_CHAR, 0, MPI_COMM_WORLD);

其中linesCount是数组中的字符串数。

如何实现?

1 个答案:

答案 0 :(得分:1)

假设您存储在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]);

如果您在实施我的答案时遇到问题,我可以发布整个测试用例。