Как MPI_Gatherv со смещениями на отправляющей стороне? - PullRequest
2 голосов
/ 06 июля 2011

Я пытаюсь рекомбинировать подмассивы без темно-серых рядов с MPI_Gatherv.Изображение стоит тысячи слов:

графическое представление о призрачных / ореолах темно-серых ячеек http://img535.imageshack.us/img535/9118/ghostcells.jpg

Как бы вы отправляли только части *sendbuf (первый параметр в Руководство MPI_Gatherv ) к корневому процессу (без расточительного переписывания в другую структуру, на этот раз без темно-серых строк)?*displacements (4-й параметр) относится только к *recvbuf корневого процесса.

Спасибо.

Обновление (или, если быть более точным)

Я хотел также отправить «граничные» (светло-серые) ячейки ... а не только «внутренние» (белые) ячейки.Как правильно указал osgx : в этом случае достаточно MPI_Gatherv ... это сделает некоторая условная индексация массива.

1 Ответ

2 голосов
/ 06 июля 2011

Как насчет создания типа данных, который позволит вам отправлять только белые (внутренние) ячейки?

Объединенный (производный) тип данных может быть MPI_Type_indexed.

Единственная проблема будет с самой первой строкой и самой последней строкой в ​​процессах P0 и PN, поскольку P1 и PN должны отправлять больше данных, чем P2 .... PN-1

Для Internal + Boundary выможет создать тип данных из одной "линии" с

MPI_Datatype LineType;
MPI_Type_vector (1, row_number, 0 , MPI_DOUBLE, &LineType)
MPI_Type_commit ( &LineType);

Затем (для размера [I] [J] ARRAY, разделенного на полосы 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); 
...