【问题标题】:MPI broadcast array of stringsMPI 广播字符串数组
【发布时间】:2018-05-20 20:16:37
【问题描述】:

是否可以广播定义为

的字符串数组
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 是数组中的字符串数。

如何实现?

【问题讨论】:

标签: c arrays string mpi openmpi


【解决方案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, &amp;p_rank) 获得的标准处理器等级。并在最后成功打印为

/* Print */
printf("Process rank %d:\n", p_rank);
for (i=0; i < linesCount; i++)
     printf("%s\n", lines[i]);

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

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 2020-08-09
    • 2011-08-23
    • 2014-05-07
    • 2013-11-13
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多