Наиболее подходящий MPI_Datatype для "декомпозиции блока"? - PullRequest
0 голосов
/ 06 июля 2011

С помощью Джонатана Дурси и osgx я теперь выполнил "декомпозицию строк" среди процессов:

строка http://img535.imageshack.us/img535/9118/ghostcells.jpg


Теперь я хотел бы попробовать подход «декомпозиции блоков» (изображенный ниже): блок http://img836.imageshack.us/img836/9682/ghostcellsblock.jpg

Как это сделать? На этот раз MPI_Datatype будет необходимо, верно? Какой тип данных будет наиболее подходящим / простым в использовании? Или это возможно сделать без типа данных?

1 Ответ

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

Вы всегда можете обойтись без типа данных, просто создав буфер и скопировав его в виде счетчика базового типа; это концептуально самое простое. С другой стороны, он медленнее и на самом деле включает в себя намного больше строк кода. Тем не менее, это может быть удобно, когда вы пытаетесь заставить что-то работать, а затем вы можете реализовать версию datatype-y вместе с ней и убедиться, что вы получаете те же ответы.

Для заполнения ячейки-призрака в направлении i вам не нужен тип, так как он похож на то, что вы делали; но вы можете использовать один, MPI_Type_contiguous, который просто указывает счет какого-то типа (который вы можете сделать в любом случае в вашем send / recv).

Для заполнения ячейки-призрака в направлении j, вероятно, проще всего использовать MPI_Type_Vector. Если вы отправляете самый правый столбец (скажем) массива с i = 0..N-1, j = 0..M-1, вы хотите отправить вектор с count = N, blocksize = 1, stepde = M , То есть вы отправляете куски подсчета, состоящие из 1 значения, каждое из которых разделено значениями M в массиве.

Вы также можете использовать MPI_Type_create_subarray, чтобы выделить только ту область массива, которую вы хотите; это, вероятно, немного излишне в этом случае.

Теперь, если, как и в предыдущем вопросе, вы хотите в какой-то момент собрать все подмассивы на один процессор, вы, вероятно, будете использовать подмассивы, и на часть вопроса ответ здесь: MPI_Type_create_subarray и MPI_Gather . Обратите внимание, что если ваши массивы имеют разные размеры, то все становится немного сложнее.

(На самом деле, почему вы все равно делаете сборку на одном процессоре? Это в конечном итоге станет узким местом масштабируемости. Если вы делаете это для ввода-вывода, как только вы освоитесь с типами данных, вы можете использовать MPI-IO для этого ..)

...