我正在尝试使用MPI_Gatherv
重新组合子阵列而不使用深灰色行。图片胜过千言万语:
如何只将*sendbuf
的部分(MPI_Gatherv manual中的第一个参数)发送到根进程(在另一个结构中没有浪费的重写,这次没有深灰色的行)? *displacements
(第4个参数)仅与根进程的*recvbuf
相关。
谢谢。
我还希望发送“边界”(浅灰色)单元格...而不仅仅是“内部”(白色)单元格。正如 osgx 正确指出的那样:在这种情况下,MPI_Gatherv
就足够......一些条件数组索引就可以了。
答案 0 :(得分:2)
如何构建数据类型,只允许发送白色(内部)单元格?
组合(派生)数据类型可以是MPI_Type_indexed
。
唯一的问题是进程P0和PN中的第一行和最后一行,因为P1和PN应该发送更多的数据,然后是P2 .... PN-1
对于Interior + Boundary,您可以使用
构建单个“line”的数据类型MPI_Datatype LineType;
MPI_Type_vector (1, row_number, 0 , MPI_DOUBLE, &LineType)
MPI_Type_commit ( &LineType);
然后(对于ARRAY大小[I] [J]分割为stripecount
条纹)
for (i=0; i< processes_number; ++i) {
displs[i] = i*(I/stripecount)+1; // point to second line in each stripe
rcounts[i] = (I/stripecount) -2 ;
}
rcounts[0] ++; // first and last processes must send one line more
rcounts[processes_number-1] ++;
displs[0] -= 1; // first process should send first line of stripe
// lastprocess displacement is ok, because it should send last line of stripe
source_ptr = ARRAY[displs[rank]];
lines_to_send = rcounts[rank];
MPI_Gatherv( source_ptr, lines_to_send, LineType, recv_buf, rcounts, displs, LineType, root, comm);