140
4.9. Напишите программу для измерения времени, необходимого для выпол-
нения MPI_Barrier на MPI_COMM_WORLD. Как изменяются характеристики для
MPI_Barrier при изменении размера MPI_COMM_WORLD?
4.10. Напишите программу для определения объема буферизации, необходи-
мого для выполнения MPI_Send. Это означает, что нужно написать программу,
которая определяет, насколько большого объема сообщение может быть послано
без включения соответствующего приема в процессе назначения.
4.11. Пусть A(n,m) – матрица, созданная в процессе 0. Например, может
быть прочитана из памяти или уже была вычислена. Пусть имеем 4 процесса и
процесс 0 посылает части этой матрицы другим процессам. Процессор 1 получает
A(i,j) для i=n/2+1,...,n, и j=1,...,m/2. Процессор 2 получает A(i,j) для i=1,...,n/2 и
j=m/2+1,...,m и процессор 3 получает A(i,j) для i=n/2+1,...,n and j=m/2,...,m . Это
двумерная декомпозиция А на четыре процесса. Напишите программу рассылки
частей матрицы по процессам, используйте MPI_Scatterv, чтобы послать данные
из процессора 0 всем другим процессам (включая процесс 0).
4.12. Пусть имеем двумерный массив X размера maxn*maxn. Эта структура
есть двумерная регулярная сетка точек, которую разделим на слои, каждый из
которых будет обрабатывать отдельный процесс. Пусть вычисления, которые не-
обходимо выполнить, нуждаются в смежных значениях. Это означает, что для
вычисления нового значения x[i][j] необходимо знать: x[i][j+1], x[i][j-1], x[i+1][j],
x[i-1][j]. Последние два могут быть проблемой, если они находятся в смежных
процессах. Чтобы разрешить это, определим теневые точки в каждом процессе,
которые будут содержать эти смежные точки. Элементы среды, которые исполь-
зуются, чтобы сохранять данные из других процессов, называются «теневыми».
Напишите программу для правильного заполнения теневых точек в каждом про-
цессе. Для простоты предположите:
1) maxn = 12 и количество процессов =4;
2) каждый процесс заполняет свою часть массива собственным номером в
коммуникаторе, а теневые точки значениями -1. После обмена с соседними
процессами необходимо проверить правильность заполнения теневых точек;
3) область непериодическая, то есть верхний процесс (номер = size-1) только по-
сылает и принимает данные от нижележащего процесса (номер = size–2), а са-
мый нижний процесс (номер = 0) передает и принимает данные только от про-
цесса выше него (номер = 1).
4.13. Выполните задание 4.12, используя неблокируемые парные обмены
вместо блокируемых. Замените MPI_Send и MPI_Recv процедурами MPI_ISend и
MPI_IRecv и используйте MPI_Wait или MPI_Waitall для теста на окончание не-
блокируемой операции.
4.14. Выполните задание 4.12, заменив в решении вызовы MPI_Send и
MPI_Recv двумя вызовами MPI_SendRecv. Первый вызов должен сдвинуть дан-
ные вверх, то есть послать данные процессору, который расположен выше и при-
нять данные от процессора, расположенного ниже. Второе обращение к
MPI_SendRecv должно быть обратным первому: послать данные нижележащему
процессору и получить данные от процессора, расположенного выше.