next up previous contents
Next: Привязки к языкам программирования Up: Примеры Previous: Двойная буферизация при коллективном   Contents

Конструктор типа ''субмассив''

\includegraphics[scale=1.0]{pic/9.4.eps}


Рисунок 9.4. Пример раскладки файла с массивом

\includegraphics[scale=1.0]{pic/9.5.eps}


Рисунок 9.5. Пример файлового типа для локального массива процесса 1

Предположим, что мы выписываем двумерный $100 \times 100$ массив чисел с двойной точностью, которые распределяется между четырьмя процессами, так, что кажый процесс имеет блок из 25 колонок (процесс 0 отвечает за колонки 0-24, процесс 1 - за 25-49 и т.д.), как это показано на рис. 7.4. Чтобы создать файловые типы для каждого из процессов, можно использовать следующую программу на Си:

double subarray[100][25]; MPI_Datatype filetype; int sizes[2], subsizes[2], starts[2]; int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); sizes[0]=100; sizes[1]=100; subsizes[0]=100; subsizes[1]=25; starts[0]=0; starts[1]=rank*subsizes[1]; MPI_Type_create_subarray(2, sizes, subsizes, starts, MPI_ORDER_C, MPI_DOUBLE, &filetype);

Или, что эквивалентно, на ФОРТРАНe:

double precision subarray(100,25) integer filetype, rank, ierror integer sizes(2), subsizes(2), starts(2) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror) sizes(1)=100 sizes(2)=100 subsizes(1)=100 subsizes(2)=25 starts(1)=0 starts(2)=rank*subsizes(2) call MPI_TYPE_CREATE_SUBARRAY(2, sizes, subsizes, starts, & MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, & filetype, ierror)

Сгенерированные файловые типы будут описывать части, содержащиеся в внутри подмассивов каждого процесса с дырками для места, которое занимают пождмассивы других процессов. Рис. 9.5 демонстрирует файловый тип, созданный для процесса 1.



Alex Otwagin 2002-12-10