使用MPI汇总文本文件

时间:2016-10-24 22:34:07

标签: c mpi

是否有一种简单的方法可以在单个核心上连接来自多个核心的多个文本文件。

核心0

1 4 6 4 2 6
4 5 4 2 4 7
3 5 6 7 8 5

核心1

5 6 7 5 3 6
5 6 7 8 5 4
6 4 3 5 6 7

核心2

6 7 8 5 3 6
4 5 7 3 4 5
8 7 6 5 2 3
6 7 8 6 5 4
8 9 0 3 2 1

我想在核心0上添加来自核心1和核心2的文本文件的文本文件。我知道它就像......

int textSize = ...; // size of text file on each core 
      if (rank == 0) {
            int size = malloc(sizeof(float) * textSize);
      }
      MPI_Gather(&name_of_text_file, textSize, MPI_FLOAT, *size, textSize, MPI_FLOAT, 0, MPI_COMM_WORLD);

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我知道你不是指文本文件,而是指通过指针访问的算术数据。我也明白你的问题是并非所有进程都有相同的数据大小。

在这种情况下,您可能正在寻找MPI_Gatherv功能。它的工作方式与MPI_Gather函数非常相似,但您可以为每个进程定义将发送多少数据(在接收排名中指定的recvcounts数组)并将它们放在目标位置({ {1}}数组)。

以下是MPI Forum的文档中的两个示例:

简单的MPI_Gather ,其中只有主等级为完整的数据数据分配内存:

displs

Example of MPI_Gather (from MPI Forum)

在此示例中,所有进程都具有100个整数的块。在您的情况下,您可能希望将MPI_Comm comm; int gsize,sendarray[100]; int root, myrank, *rbuf; ... MPI_Comm_rank( comm, myrank); if ( myrank == root) { MPI_Comm_size( comm, &gsize); rbuf = (int *)malloc(gsize*100*sizeof(int)); } MPI_Gather( sendarray, 100, MPI_INT, rbuf, 100, MPI_INT, root, comm); 更改为int

<强> MPI_Gatherv

float

Example of MPI_Gatherv (from MPI Forum)

在此示例中,接收相同数量的元素(100个整数)并定期放在由MPI_Comm comm; int gsize,sendarray[100]; int root, *rbuf, stride; int *displs,i,*rcounts; ... MPI_Comm_size( comm, &gsize); rbuf = (int *)malloc(gsize*stride*sizeof(int)); displs = (int *)malloc(gsize*sizeof(int)); rcounts = (int *)malloc(gsize*sizeof(int)); for (i=0; i<gsize; ++i) { displs[i] = i*stride; rcounts[i] = 100; } MPI_Gatherv( sendarray, 100, MPI_INT, rbuf, rcounts, displs, MPI_INT, root, comm); 整数分隔的内存区域中。目标数组(stride)可以存储( number_of_ranks * stride )整数。

如果你知道的话,你可以完全忽略固定大小的步幅,并为每个进程单独设置rbufdispls。如果您不了解它们,请查看MPI论坛页面中的最后一个示例。

在任何情况下,我都假设您使用的是单指针(例如array [i])而不是double(例如array [i] [j])。这需要一些额外的努力来设置正确的索引,但在MPI中使用起来更简单,在某些情况下也更快。