MPI中的鬼细胞交换模式

时间:2017-03-17 00:40:05

标签: c++ mpi communication

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

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

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);

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

1 个答案:

答案 0 :(得分:2)

理想情况下,ghost单元格应该与 normal 单元格属于同一个内存块。这样,您可以保持简单的寻址方案。在该方案中,使用function removeDuplicates() { for(var i = arrItems.length - 1; i >= 0; i--) { for(var j = 0; j < arrSelectedItems.length; j++) { if(JSON.stringify(arrItems[i]) == JSON.stringify(arrSelectedItems[j])) { arrItems.splice(i, 1); } } } } MPI_Scatter以完整行的倍数分布图像。在非边界排名中,您为另外两个重影行分配了足够的内存:

MPI_Gather

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

简单的一维分裂的问题在于通信成本和额外的光环数据是非最优的。特别是对于较小的图像和较多的参与队伍。

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