【问题标题】:MPI 2D array processingMPI 2D 阵列处理
【发布时间】:2021-12-20 16:55:19
【问题描述】:

我有二维整数数组。我想将它处理到新数组。新数组的每个元素是具有给定边距的主数组元素邻居的平均值。简单的算法是:

double *buffer = new double[bufferSize];
for (int row = margin; row < arraySize - margin; row++)
        for (int col = margin; col < arraySize - margin; col++) {
            fillBuffer(row, col, buffer);
            nextData[row][col] = average(buffer);
        }

fillBuffer 函数:

void fillBuffer(int row, int col, double *buffer) {
    int counter = 0;
    for (int i = row - margin; i <= row + margin; i++)
        for (int j = col - margin; j <= col + margin; j++)
            buffer[counter++] = data[i][j];
}

我想使用 MPI 将其并行化。我想知道是否可以使用 MPI_Scatter 函数为每个等级拆分主数组,但每个等级仍然需要来自另一个等级的数据来计算数组块边缘的值。也许我可以将主阵列发送到所有等级,但如何管理它们只处理它们的一部分?那么如何将数组的计算元素与另一个需要它计算边缘元素的rank共享?

由于我是 MPI 新手,因此任何提示都可能会有所帮助。

【问题讨论】:

标签: c++ mpi


【解决方案1】:

您需要放弃整个数组都存在于某个地方的想法,然后让工作并行进行。您需要并行创建数组,每个进程只有它的一部分。推断未来,每个流程都有大量数据。那么不可能首先在一个进程上创建所有这些。 (如果您没有大量数据,那么分散调用将比仅在一个进程上执行操作花费更多时间。)

所以分散方法不是正确的方法。

但是,如果您分发该数组,则“仅处理他们的部分”是微不足道的,因为这就是他们所拥有的一切!如果他们需要邻居的数据,那么您需要MPI_Send/recv

【讨论】:

  • 假设我们有一个 16x16 矩阵,我们希望将工作拆分为 2、4、8 等进程。有没有办法让它通用?还是我必须依靠 if 语句对 MPI_Send/recv 数据进行适当的排名?
  • @MaciekB 如果进程数除以行数,那么数据的划分很简单。如果不是这种情况,您必须稍微平衡一下工作。每个进程计算myfirstrow,mylastrow,分配localrows = mylastrow-myfirstrow 行,并为工作迭代for (myrow=0...localrows)
猜你喜欢
  • 2012-12-26
  • 2016-08-25
  • 2020-03-30
  • 2017-07-17
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2023-04-10
相关资源
最近更新 更多