0

我花了一些时间考虑一个计算矩阵的方案,一切都很有意义,但最后一部分我不知道如何处理。

这是我打算做的(场景):

  1. 要求计算一个 10(w)x5(h) 矩阵。
  2. 我有 10 个处理器可用。
  3. 在每个单独的处理器上声明一个 1x5 矩阵,包括秩为 0 的 proc。
  4. 计算每个处理器上的每个子矩阵的偏移量。
  5. MPI_Barrier 等待所有 10 个处理器完成计算。
  6. 显示完整的矩阵。

    一直到第五步我很高兴,但我不知道该怎么做才能越过障碍。没有一个处理器具有完整的 10x5 矩阵。一开始我想我不需要一个,我想要这样的东西:

      foreach(procX in proc(0-9))
          showColumn(procX)
    

但是我不知道在 MPI_Barrier 之后将调用哪个处理器,并且我不知道如何根据处理器的顺序来打印东西(否则矩阵将无法正确打印)。

有没有人知道如何正常处理这个问题?我已经阅读了很多关于让每个处理器在矩阵的某些部分上工作的内容,但是我找不到任何关于如何组合这些不同部分的内容。

我没有在我的代码中使用散点图(即,没有使用主从技术)

谢谢

4

2 回答 2

2

虽然可以让每个等级打印自己的本地部分并按照 suszterpatt 给出的答案进行同步,但它依赖于不属于 MPI 标准的功能,因此不能保证始终有效,仅推荐用于诊断用途。

首先,有些机器及其相应的 MPI 实现不允许 0 级以外的任何等级发送到其标准输出。其次,即使所有等级的标准输出都被重定向到mpiexec进程,它通常也会被缓冲。因此,即使使用障碍强制执行打印顺序, rank 的标准输出i+1也可能在 rank 的输出之前显示。i换句话说,MPI 不提供显式刷新操作(例如,类似的操作fflush(stdout)),可以强制将本地标准输出缓冲区发送到mpiexec后者并由后者显示。由实现决定如何处理它。

更符合标准的方法是让每个等级将其矩阵的一部分发送到等级 0,这反过来打印:

if (rank == 0)
{
   allocate temp_buffer;
   for (i = 1; i < num_procs; i++)
   {
       receive from rank i into temp_buffer
       print temp_buffer
   }
}
else
{
   send local matrix part to rank 0
}

这样就不会使用显式的屏障同步,并且因为只有一个进程输出,所以保证了显示的行的顺序。

另一种选择是让每个等级打印到本地字符串缓冲区 - 例如使用sprintf- 然后将缓冲区发送到等级 0 并让后者显示接收到的字符串。

于 2013-11-02T13:06:54.243 回答
0

如果您不想在单个进程中收集整个矩阵,则可以使用如下循环:

for ( i = 0; i < 9; i++ )
{
    if ( i == myRank )
    {
        // print local matrix
    }
    MPI_Barrier(MPI_COMM_WORLD);
}
于 2013-11-01T20:28:49.127 回答