Programming Taskbook


E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

English

ЮФУ

Электронный задачник по программированию

©  М. Э. Абрамян (Южный федеральный университет), 1998–2020

 

PT for MPI-2 | Группы заданий | MPI7Win

PrevNext


Односторонние коммуникации (MPI-2)

При определении окна доступа с помощью функции MPI_Win_create рекомендуется всегда указывать смещение disp_unit (третий параметр), равным протяженности элемента данных соответствующего типа (в заданиях это всегда либо тип MPI_INT, либо тип MPI_DOUBLE; протяженность следует определять с помощью функции MPI_Type_get_extent). В этом случае при последующих вызовах функций одностороннего доступа MPI_Get, MPI_Put, MPI_Accumulate будет достаточно указывать смещение target_disp (пятый параметр любой из этих функций) равным начальному индексу используемого фрагмента массива (а не числу байтов от начала массива до требуемого фрагмента).

В качестве параметра info (четвертый параметр функции MPI_Win_create) достаточно указывать константу MPI_INFO_NULL.

Если в некоторых процессах окно доступа определять не требуется, то в качестве параметра size (второго параметра функции MPI_Win_create) в этих процессах следует указывать значение 0.

В качестве параметра assert во всех синхронизирующих функциях (MPI_Win_fence, MPI_Win_start, MPI_Win_post, MPI_Win_lock) достаточно указывать константу 0 (данный параметр является предпоследним параметром во всех перечисленных функциях).

В первой подгруппе (задания MPI7Win1–MPI7Win17) в качестве синхронизирующих функций следует использовать коллективную функцию MPI_Win_fence, которая должна вызываться как перед действиями, связанными с односторонней пересылкой данных, так и после этих действий (но перед действиями, связанными с доступом к пересланным данным).

Задания второй подгруппы (MPI7Win18–MPI7Win30) требуют применения локальных вариантов синхронизации: функций MPI_Win_start, MPI_Win_complete, MPI_Win_post, MPI_Win_wait или пары функций MPI_Win_lock, MPI_Win_unlock. В заданиях этой подгруппы всегда указывается, какой вариант синхронизации требуется использовать.

Односторонние коммуникации с простейшей синхронизацией

MPI7Win1°. В каждом из подчиненных процессов дано одно целое число. В главном процессе определить окно доступа размера K целых чисел (K — количество подчиненных процессов) и, используя функцию MPI_Put в подчиненных процессах, записать в главный процесс все исходные числа, после чего вывести эти числа в порядке возрастания рангов переславших их процессов.

MPI7Win2°. В каждом из подчиненных процессов дано R вещественных чисел, где R — ранг процесса (1, 2, …). В главном процессе определить окно доступа подходящего размера и, используя функцию MPI_Put в подчиненных процессах, записать в главный процесс все исходные числа, после чего вывести эти числа в порядке возрастания рангов переславших их процессов.

MPI7Win3°. В главном процессе дан массив A из K целых чисел, где K — количество подчиненных процессов. Определить в главном процессе окно доступа, содержащее массив A, и, используя функцию MPI_Get в подчиненных процессах, получить и вывести в них по одному элементу массива A, перебирая элементы с конца (элемент A0 получить в последнем процессе, A1 в предпоследнем, и т. д.).

MPI7Win4°. В главном процессе дан массив A из K + 4 вещественных чисел, где K — количество подчиненных процессов. Определить в главном процессе окно доступа, содержащее массив A, и, используя функцию MPI_Get в подчиненных процессах, получить и вывести в них по пять элементов массива A, начиная с элемента с индексом R − 1, где R — ранг подчиненного процесса (R = 1, 2, …, K − 1).

MPI7Win5°. В главном процессе дан массив A из K целых чисел, где K — количество подчиненных процессов. В каждом подчиненном процессе дан индекс N (число от 0 до K − 1) и целое число B. В главном процессе определить окно доступа, содержащее массив A, и, используя функцию MPI_Accumulate в каждом подчиненном процессе, умножить элемент AN на число B, после чего вывести в главном процессе измененный массив A.

Примечание. Некоторые подчиненные процессы могут содержать совпадающие значения N; в этом случае элемент AN должен умножаться на несколько чисел. Данное обстоятельство не требует дополнительных действий по синхронизации в силу особенностей реализации функции MPI_Accumulate.

MPI7Win6°. В главном процессе дан вещественный массив A размера 2K − 1 (K — количество подчиненных процессов), в каждом подчиненном процессе дан вещественный массив B размера R, где R — ранг процесса (1, 2, …, K − 1). В главном процессе определить окно доступа, содержащее массив A, и, используя функцию MPI_Accumulate в каждом подчиненном процессе, прибавить к элементам массива A, начиная с индекса R − 1, значения всех элементов массива B из процесса ранга R, после чего вывести в главном процессе измененный массив A (единственный элемент B0 из процесса 1 прибавляется к элементу A0, элементы B0 и B1 из процесса 2 прибавляются соответственно к элементам A1 и A2, элементы B0, B1 и B2 из процесса 3 прибавляются соответственно к элементам A2, A3 и A4, и т. д.).

Примечание. К элементам массива A, начиная с индекса 2, потребуется прибавлять несколько значений из разных подчиненных процессов. Данное обстоятельство не требует дополнительных действий по синхронизации в силу особенностей реализации функции MPI_Accumulate.

MPI7Win7°. В главном процессе дан массив A из 2K целых чисел, где K — количество подчиненных процессов. Во всех подчиненных процессах определить окно доступа из двух целых чисел и, используя несколько вызовов функции MPI_Put в главном процессе, записать и вывести в каждом подчиненном процессе по два элемента из массива A, перебирая их в исходном порядке (элементы A0 и A1 надо вывести в процессе 1, элементы A2 и A3 — в процессе 2, и т. д.).

MPI7Win8°. В каждом процессе дано целое число R и вещественное число B. Все числа R различны и лежат в диапазоне от 0 до K − 1, где K — количество процессов. Во всех процессах определить окно доступа из одного вещественного числа и, используя функцию MPI_Put в каждом процессе, переслать число B из этого процесса в процесс R, после чего вывести полученные числа во всех процессах.

MPI7Win9°. В каждом процессе дан массив A из K целых чисел, где K — количество процессов. Во всех процессах определить окно доступа, содержащее массив A, и, используя несколько вызовов функции MPI_Get в каждом процессе R (R = 0, …, K − 1), получить и вывести элементы всех массивов A с индексом R, перебирая эти элементы в порядке убывания рангов содержащих их процессов (вначале выводится элемент, полученный из процесса ранга K − 1, затем элемент из процесса ранга K − 2, и т. д.).

Примечание. Функцию MPI_Get, как и другие функции, обеспечивающие односторонние коммуникации, можно использовать и для доступа к окну, определенному в вызывающем процессе.

MPI7Win10°. В каждом процессе дан массив A из 3 вещественных чисел и целые числа N1 и N2, каждое из которых лежит в диапазоне от 0 до 2. Во всех процессах определить окно доступа, содержащее массив A, и, используя по два вызова функции MPI_Get в каждом процессе, получить из предыдущего процесса элемент его массива A с индексом N1, а из последующего процесса — элемент с индексом N2 (числа N1 и N2 берутся из вызывающего процесса, процессы перебираются циклически). Вывести в каждом процессе полученные числа в указанном порядке.

MPI7Win11°. Количество процессов K — четное число. В каждом процессе дан массив A из K/2 целых чисел. Во всех процессах нечетного ранга (1, 3, …, K − 1) определить окно доступа, содержащее массив A, и, используя требуемое число вызовов функции MPI_Accumulate в каждом процессе четного ранга, добавить элемент A[I] из процесса ранга 2J к элементу A[J] из процесса ранга 2I + 1 (I, J = 0, …, K/2 − 1) и вывести измененные массивы A во всех процессах нечетного ранга.

Указание. Требуемое преобразование можно описать по-другому: если через B обозначить матрицу порядка K/2, строки которой совпадают с массивами A из процессов четного ранга, а через C — матрицу того же порядка, строки которой совпадают с массивами A из процессов нечетного ранга, то преобразование состоит в прибавлении к I-му столбцу матрицы C соответствующих элементов I-й строки матрицы B.

MPI7Win12°. Решить задачу MPI7Win11, определив окна доступа в процессах четного ранга и используя вместо функций MPI_Accumulate функции MPI_Get в процессах нечетного ранга.

Указание. Поскольку числа, полученные из процессов четного ранга, необходимо добавлять к элементам массива A после вызова функции синхронизации MPI_Win_fence, удобно использовать вспомогательный массив для хранения полученных чисел.

MPI7Win13°. В каждом процессе даны три целых числа N1, N2, N3, каждое из которых лежит в диапазоне от 0 до K − 1, где K — количество процессов (значения некоторых из этих чисел в каждом процессе могут совпадать). Кроме того, в каждом процессе дан массив A вещественных чисел размера R + 1, где R — ранг процесса (0, …, K − 1). Во всех процессах определить окно доступа, содержащее массив A, и, используя по три вызова функции MPI_Accumulate в каждом процессе, добавить ко всем элементам массива A в процессах рангов N1, N2 и N3 вещественное число, равное R + 1, где R — ранг процесса, вызвавшего функции MPI_Accumulate (например, если число N1 в процессе ранга 3 равно 2, то ко всем элементам массива A из процесса 2 надо добавить вещественное число 4.0). Если некоторые из чисел N1, N2, N3 в процессе R совпадают, то числа R + 1 надо добавлять к элементам соответствующих массивов несколько раз. Вывести измененные массивы A в каждом процессе.

MPI7Win14°. В каждом процессе дан массив вещественных чисел размера K (K — количество процессов), содержащий строку верхнетреугольной матрицы A, включая ее начальную нулевую часть (процесс ранга R содержит R-ю строку матрицы в предположении, что строки нумеруются от 0). Во всех процессах определить окно доступа, содержащее исходный массив, и, используя требуемое количество вызовов функции MPI_Get в каждом процессе, записать в эти массивы (и затем вывести) строки матрицы, транспонированной к исходной матрице A, включая ее завершающую нулевую часть. Вспомогательные массивы не использовать.

Указания. (1) Строки транспонированной матрицы совпадают со столбцами исходной матрицы, таким образом, полученная матрица будет нижнетреугольной. (2) Обнулять требуемые элементы массивов перед их выводом необходимо после второго вызова функции MPI_Win_fence. (3) Окно доступа для последнего процесса можно не создавать.

MPI7Win15°. Решить задачу MPI7Win14, используя вместо вызовов функций MPI_Get вызовы функций MPI_Put.

Указание. В данном случае можно не создавать окно доступа для главного процесса.

MPI7Win16°. В каждом процессе дана одна строка вещественной квадратной матрицы A порядка K, где K — количество процессов (процесс ранга R содержит R-ю строку матрицы в предположении, что строки нумеруются от 0). Кроме того, в каждом процессе дано вещественное число B. Во всех процессах определить окно доступа, содержащее строку матрицы A, и, используя требуемое число вызовов функции MPI_Accumulate в каждом процессе ранга R (R = 0, …, K − 1), заменить в строке матрицы из следующего процесса все элементы, меньшие числа B из процесса R, на это число (процессы перебираются циклически). Затем, используя K вызовов функции MPI_Get в каждом процессе, получить и вывести столбец преобразованной матрицы A с номером, совпадающим с рангом процесса (столбцы также нумеруются от 0).

Указание. При выполнении этого задания в каждом процессе необходимо трижды вызывать функцию синхронизации MPI_Win_fence.

MPI7Win17°. В каждом процессе дана одна строка вещественной квадратной матрицы A порядка K, где K — количество процессов (процесс ранга R содержит R-ю строку матрицы в предположении, что строки нумеруются от 0). Кроме того, в каждом процессе дано вещественное число B. Во всех процессах определить окно доступа, содержащее строку матрицы A, и, используя требуемое число вызовов функции MPI_Accumulate в каждом процессе ранга R (R = 0, …, K − 1), заменить в строке матрицы из предыдущего процесса все элементы, большие числа B из процесса R, на это число (процессы перебираются циклически). Затем, используя K вызовов функции MPI_Accumulate в каждом подчиненном процессе, добавить начальный элемент строки из каждого подчиненного процесса ранга R (1, …, K − 1) ко всем элементам столбца преобразованной матрицы A с номером R (столбцы также нумеруются от 0). После всех описанных преобразований вывести в каждом процессе новое содержимое соответствующей строки матрицы A.

Указание. При выполнении этого задания в каждом процессе необходимо трижды вызывать функцию синхронизации MPI_Win_fence.

Дополнительные виды синхронизации

MPI7Win18°. Количество процессов K — четное число. В каждом процессе четного ранга (0, 2, …, K − 2) дано целое число A. Во всех процессах нечетного ранга (1, 3, …, K − 1) определить окно доступа из одного целого числа и, используя функцию MPI_Put в каждом процессе четного ранга 2N, переслать число A в процесс ранга 2N + 1 и вывести его в этом процессе. Для синхронизации использовать функции MPI_Win_start и MPI_Win_complete в процессах четного ранга и функции MPI_Win_post и MPI_Win_wait в процессах нечетного ранга; для создания группы процессов, указываемой в качестве первого параметра функций MPI_Win_start и MPI_Win_post, использовать функцию MPI_Group_incl, применив ее к группе, полученной из коммуникатора MPI_COMM_WORLD (с помощью функции MPI_Comm_group).

Примечание. В отличие от коллективной функции MPI_Win_fence, использовавшейся в предыдущих заданиях данной группы, синхронизирующие функции, используемые в этом и последующих заданиях, являются локальными и, кроме того, позволяют явным образом определить группы инициирующих (origin) и целевых (target) процессов при односторонних коммуникациях.

MPI7Win19°. В главном процессе дан массив A из K вещественных чисел, где K — количество подчиненных процессов. В главном процессе определить окно доступа, содержащее массив A, и, используя функцию MPI_Get в каждом подчиненном процессе, получить и вывести один из элементов массива A, перебирая элементы в обратном порядке (в процессе ранга 1 надо получить элемент массива с индексом K − 1, в процессе ранга 2 — элемент с индексом K − 2, и т. д.). Для синхронизации использовать функции MPI_Win_start и MPI_Win_complete в подчиненных процессах и функции MPI_Win_post и MPI_Win_wait в главном процессе; для создания группы процессов, указываемой в качестве первого параметра функции MPI_Win_start, использовать функцию MPI_Group_incl, для создания группы, указываемой в функции MPI_Win_post, использовать функцию MPI_Group_excl (применив обе эти функции к группе, полученной из коммуникатора MPI_COMM_WORLD).

MPI7Win20°. Число процессов K кратно 3. В процессах ранга 3N (N = 0, …, K/3 − 1) дан массив A из трех вещественных чисел. Во всех процессах, в которых дан массив, определить окно доступа, содержащее этот массив, и, используя по одному вызову функции MPI_Get в процессах ранга 3N + 1 и 3N + 2 (N = 0, …, K/3 − 1), прочесть и вывести соответственно один элемент A0 и два элемента A1 и A2 из процесса ранга 3N (процесс 1 должен вывести элемент A0, полученный из процесса 0, процесс 2 — элементы A1 и A2, полученные из процесса 0, процесс 4 — элемент A0, полученный из процесса 3, и т. д.). Для синхронизации использовать функции MPI_Win_post и MPI_Win_wait в процессах ранга 3N и функции MPI_Win_start и MPI_Win_complete в остальных процессах.

MPI7Win21°. Количество процессов K — четное число. В главном процессе дан массив A из K/2 вещественных чисел и массив N целых чисел того же размера. Все элементы массива N различны и лежат в диапазоне от 1 до K − 1. В каждом подчиненном процессе определить окно доступа из одного вещественного числа и, используя требуемое количество вызовов функции MPI_Put в главном процессе, переслать в каждый из подчиненных процессов ранга NI (I = 0, …, K/2 − 1) число AI и вывести полученное число (в остальных подчиненных процессах вывести вещественное число 0.0). Для синхронизации использовать функции MPI_Win_post и MPI_Win_wait в подчиненных процессах и функции MPI_Win_start и MPI_Win_complete в главном процессе.

MPI7Win22°. В главном процессе дан массив A вещественных чисел размера K (K — количество подчиненных процессов) и массив N целых чисел размера 8. Все элементы массива N лежат в диапазоне от 1 до K; некоторые элементы данного массива могут совпадать. В каждом подчиненном процессе дан вещественный массив B размера R, где R — ранг процесса (R = 1, …, K). Определить в каждом подчиненном процессе окно доступа, содержащее массив B, и, используя требуемое количество вызовов функции MPI_Accumulate в главном процессе, добавить ко всем элементам массивов B из процессов ранга NI (I = 0, …, 7) элементы массива A с теми же индексами (к элементу B0 добавляется элемент A0, к элементу B1 — элемент A1, и т. д.); для некоторых массивов B элементы из массива A могут добавляться несколько раз. В каждом подчиненном процессе вывести массив B (который либо изменится, либо сохранит исходные значения элементов). Для синхронизации использовать функции MPI_Win_post и MPI_Win_wait в подчиненных процессах и функции MPI_Win_start и MPI_Win_complete в главном процессе.

MPI7Win23°. Во всех процессах даны вещественные массивы A размера 5. Кроме того, в главном процессе даны целочисленные массивы N и M размера 5 каждый. Все элементы массива N лежат в диапазоне от 1 до K, где K — количество подчиненных процессов, все элементы массива M лежат в диапазоне от 0 до 4; некоторые элементы как в массиве N, так и в массиве M могут совпадать. В каждом подчиненном процессе определить окно доступа, содержащее массив A, и, используя требуемое количество вызовов функции MPI_Get в главном процессе, получить из процесса ранга NI (I = 0, …, 4) элемент массива A с индексом MI и добавить его значение к элементу массива A главного процесса с индексом I. После изменения массива A в главном процессе выполнить следующую корректировку массивов A всех подчиненных процессов: заменить в них те элементы, которые больше элемента массива A с тем же индексом из главного процесса, на этот элемент, используя требуемое количество вызовов функции MPI_Accumulate в главном процессе. В каждом процессе вывести преобразованные массивы A. Для синхронизации использовать два вызова пары функции MPI_Win_post и MPI_Win_wait в подчиненных процессах и два вызова пары функции MPI_Win_start и MPI_Win_complete в главном процессе.

MPI7Win24°. В каждом подчиненном процессе дано целое число N; все числа N различны и лежат в диапазоне от 0 до K − 1, где K — количество подчиненных процессов. В главном процессе определить окно доступа, содержащее целочисленный массив A размера K. Не выполняя никаких вызовов синхронизирующих функций в главном процессе (кроме вызова функции MPI_Barrier) и используя в подчиненных процессах последовательность вызовов синхронизирующих функции MPI_Win_lock, MPI_Win_unlock, MPI_Barrier, MPI_Win_lock, MPI_Win_unlock, записать в элементы массива A с индексом N ранг подчиненного процесса, содержащего данное значение N (с помощью функции MPI_Put), после чего получить и вывести в каждом подчиненном процессе все элементы преобразованного массива A (с помощью функции MPI_Get). В качестве первого параметра функции MPI_Win_lock указывать MPI_LOCK_SHARED.

Примечание. Синхронизирующие функции MPI_Win_lock, MPI_Win_unlock используются преимущественно при односторонних коммуникациях с пассивными целевыми процессами (passive targets), при которых целевой процесс не обрабатывает переданные ему данные, а выступает в роли их хранилища, доступного для других процессов.

MPI7Win25°. Количество процессов K кратно 3. В процессах ранга 3N (N = 0, …, K/3 − 1) дан вещественный массив A размера 5, в процессах ранга 3N + 1 дано целое число M, лежащее в диапазоне от 0 до 4, и вещественное число B. В каждом процессе, содержащем исходный массив A, определить окно доступа с этим массивом. Используя функцию MPI_Accumulate в каждом процессе ранга 3N + 1 (N = 0, …, K/3 − 1), преобразовать массив A из процесса ранга 3N следующим образом: если элемент массива с индексом M больше числа B, то он заменяется на число B (числа M и B берутся из процесса ранга 3N + 1). После этого, используя функцию MPI_Get в каждом процессе ранга 3N + 2, получить и вывести в нем все элементы преобразованного массива A из процесса ранга 3N. Использовать синхронизирующие функции MPI_Win_Lock, MPI_Win_unlock, MPI_Barrier в процессах ранга 3N + 1, функции MPI_Barrier, MPI_Win_Lock, MPI_Win_unlock в процессах ранга 3N + 2 и функцию MPI_Barrier в процессах ранга 3N. В качестве первого параметра функции MPI_Win_lock указывать MPI_LOCK_EXCLUSIVE.

MPI7Win26°. В каждом подчиненном процессе дан вещественный массив A размера 5 с положительными элементами. В главном процессе определить окно доступа, содержащее вещественный массив B размера 5 с нулевыми элементами. Не выполняя никаких вызовов синхронизирующих функций в главном процессе (кроме вызова функции MPI_Barrier) и используя в подчиненных процессах последовательность вызовов синхронизирующих функции MPI_Win_lock, MPI_Win_unlock, MPI_Barrier, MPI_Win_lock, MPI_Win_unlock, записать в каждый из элементов массива B максимальный из элементов массивов A с тем же индексом (с помощью функции MPI_Accumulate), после чего получить и вывести в каждом подчиненном процессе все элементы преобразованного массива B (с помощью функции MPI_Get). В качестве первого параметра функции MPI_Win_lock указывать MPI_LOCK_SHARED.

MPI7Win27°. В каждом подчиненном процессе даны два вещественных числа X, Y — координаты точки на плоскости. Используя вызовы функции MPI_Get в главном процессе, получить в нем числа X0, Y0, равные координатам той точки (XY) среди точек, данных в подчиненных процессах, которая является наиболее удаленной от начала координат. После этого, используя вызовы функции MPI_Get в подчиненных процессах, получить и вывести в каждом из них числа X0, Y0, найденные в главном процессе. В каждом процессе определить окно доступа, содержащее два вещественных числа (X, Y для подчиненных процессов, X0, Y0 для главного процесса). Использовать синхронизирующие функции MPI_Win_lock, MPI_Win_unlock, MPI_Barrier в главном процессе и функции MPI_Barrier, MPI_Win_lock, MPI_Win_unlock в подчиненных процессах.

Примечание. Данную задачу невозможно решить, используя односторонние коммуникации только на стороне подчиненных процессов и при этом выполняя синхронизацию с помощью блокировок lock/unlock.

MPI7Win28°. Решить задачу MPI7Win27, используя единственное окно доступа в главном процессе, содержащее числа X0, Y0. Для нахождения чисел X0, Y0 использовать функцию MPI_Get и функцию MPI_Put в подчиненных процессах (для некоторых процессов вызывать функцию MPI_Put не потребуется), для пересылки найденных чисел X0, Y0 во все подчиненные процессы использовать в них функцию MPI_Get (как и в задаче MPI7Win27). Для синхронизации обменов на этапе нахождения чисел X0, Y0 использовать два вызова пары функций MPI_Win_start и MPI_Win_complete в подчиненных процессах и вызовы в цикле двух пар функций MPI_Win_post и MPI_Win_wait в главном процессе (при этом на каждой итерации цикла необходимо определять новую группу процессов, используемую при вызове функций MPI_Win_post). Для синхронизации действий при пересылке чисел X0, Y0 в подчиненные процессы использовать, как и в задаче MPI7Win27, функцию MPI_Barrier в главном процессе и функции MPI_Barrier, MPI_Win_Lock, MPI_Win_unlock в подчиненных процессах.

Примечание. Описанный вариант решения (в отличие от варианта, приведенного в задаче MPI7Win27) позволяет использовать односторонние коммуникации только на стороне подчиненных процессов, однако при этом на первом этапе решения требуется применять вариант синхронизации, отличный от блокировок lock/unlock.

MPI7Win29°. В каждом процессе дана одна строка целочисленной квадратной матрицы порядка K, где K — количество процессов (в процессе ранга R дана строка матрицы с номером R; строки нумеруются от 0). Используя вызовы функции MPI_Get в главном процессе, получить в нем строку матрицы с минимальной суммой элементов S и, кроме того, найти количество N строк с минимальной суммой (если N > 1, то в главном процессе надо сохранить последнюю из таких строк, т. е. строку с наибольшим номером). После этого, используя вызовы функции MPI_Get в подчиненных процессах, получить и вывести в каждом из них строку с минимальной суммой S, найденную в главном процессе, значение суммы S и количество N строк с минимальной суммой. В каждом процессе определить окно доступа, содержащее K + 2 целых числа; в первых K элементах окна содержатся элементы строки матрицы, в следующем элементе — сумма их значений S, а последний элемент предназначен для хранения числа N. Использовать синхронизирующие функции MPI_Win_lock, MPI_Win_unlock, MPI_Barrier в главном процессе и функции MPI_Barrier, MPI_Win_lock, MPI_Win_unlock в подчиненных процессах.

Примечание. Данную задачу невозможно решить, используя односторонние коммуникации только на стороне подчиненных процессов и выполняя синхронизацию с помощью блокировок lock/unlock.

MPI7Win30°. Решить задачу MPI7Win29, используя единственное окно доступа в главном процессе, содержащее строку матрицы и числа S и N. Для нахождения строки с минимальной суммой элементов и связанных с ней характеристик использовать функцию MPI_Get и функцию MPI_Put в подчиненных процессах (для некоторых процессов вызывать функцию MPI_Put не потребуется), для пересылки найденных данных во все подчиненные процессы использовать в них функцию MPI_Get (как и в задаче MPI7Win29). На этапе нахождения строки с минимальной суммой функцию MPI_Get следует использовать только для получения значений S и N. Для синхронизации обменов на этапе нахождения строки с минимальной суммой использовать два вызова пары функций MPI_Win_start и MPI_Win_complete в подчиненных процессах и вызовы в цикле двух пар функций MPI_Win_post и MPI_Win_wait в главном процессе (при этом на каждой итерации цикла необходимо определять новую группу процессов, используемую при вызове функций MPI_Win_post). Для синхронизации действий при пересылке найденных данных в подчиненные процессы использовать, как и в задаче MPI7Win29, функцию MPI_Barrier в главном процессе и функции MPI_Barrier, MPI_Win_Lock, MPI_Win_unlock в подчиненных процессах.

Примечание. Описанный вариант решения (в отличие от варианта, приведенного в задаче MPI7Win29) позволяет использовать односторонние коммуникации только на стороне подчиненных процессов, однако при этом на первом этапе решения требуется применять вариант синхронизации, отличный от блокировок lock/unlock.


PrevNext

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
01.01.2020