我正在使用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行”分配内存?我应该预先分配内存然后分散吗?我不想使用“自定义数据类型”解决方案,因为它对我正在考虑的问题范围来说是一种过度杀伤。
答案 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数据类型。