是否可以广播定义为
的字符串数组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是数组中的字符串数。
如何实现?
答案 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]);
如果您在实施我的答案时遇到问题,我可以发布整个测试用例。