【问题标题】:Ghost cell exchange pattern in MPIMPI 中的幽灵单元交换模式
【发布时间】:2017-08-08 09:42:37
【问题描述】:

我正在使用 MPI 实现分布式图像(灰度)卷积。我现有的模式是在根进程中将图像读取为一维扁平数组,然后将它们分散到所有进程(行分解),然后在根进程中执行MPI_Gather,然后再次将图像作为一维扁平阵列。显然,这并没有给出预期的结果,因为使用图像卷积,边界处的情况会变得很棘手。

因此,为了改进上述模式,我想实现所谓的ghost cell exchange 模式,其中进程在ghost rows. 中交换它们的行伪代码:

if (rank == 0) {
    src = null
    dest = rank + 1
}

if (rank == size - 1) {
    src = rank - 1
    dest = null
} else {
   src = rank - 1
   dest = rank + 1
}

MPI_SendRecv(&sendbuf[offset], slen, dest..
             &recvbuf[offset], rlen, src);

如何为每个进程的“幽灵行”分配内存?我应该预先分配内存然后分散吗?我不想采用“自定义数据类型”解决方案,因为它对于我正在考虑的问题范围来说是一种过度杀伤力。

【问题讨论】:

    标签: c++ mpi communication


    【解决方案1】:

    理想情况下,幽灵单元应该与您的正常单元属于同一内存块的一部分。这样,您可以保持寻址方案简单。在该方案中,图像按完整行的倍数分布,使用MPI_ScatterMPI_Gather。在非边界等级中,您为两个额外的幽​​灵行分配了足够的内存:

    height = total_hight / ranks;
    std::vector<float> data(width * (height + 2));
    float* image = &data[width];
    float* ghost_north = &data[0]
    float* ghost_south = &data[width * (height + 1)]
    float* inner_north = image;
    float* inner_south = &image[width * (height - 1)]
    MPI_Scatter(root_image, width * height, MPI_FLOAT,
                image, width * height, MPI_FLOAT, ...);
    ...
    iterations {
        MPI_SendRecv(inner_north, width, MPI_FLOAT, north, tag,
                     ghost_north, width, MPI_FLOAT, north, tag, ...)
        MPI_SendRecv(inner_south, width, MPI_FLOAT, south, tag,
                     ghost_south, width, MPI_FLOAT, south, tag, ...)
       ... compute ...
    }
    MPI_Gather(image, width * height, MPI_FLOAT,
               root_image, width * height, MPI_FLOAT, ...);
    

    此伪代码不考虑特殊的边界情况。

    简单的一维拆分的问题在于,通信成本和额外的光环数据不是最优的。特别是对于较小的图像和更多的参与排名。

    这是一个excellent example by Rolf Rabenseifner,关于使用 MPI 进行数据分解和光环通信方法。他还解释了如何改进沟通方法。对于 2D 分解,初始通信和垂直边界都需要派生 MPI 数据类型。

    【讨论】:

    • 感谢您提供完整、明确的答案。你提到了一些关于通信成本的事情。现在,如果我要在增加图像大小时测试这个模型,我的性能应该会下降,对吧?
    • 基本上一维分解的通信成本将比二维分解更糟糕。通信开销取决于图像大小(更大=更好)、等级数(更少=更好)和每次迭代的计算量(更多=更好)的平衡。
    • 我同意那部分,一维交流会涉及很多交流。感谢你的帮助。我会继续并尽快接受答案
    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 2014-07-08
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    相关资源
    最近更新 更多