Programming Taskbook


E-mail:

Пароль:

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

English

ЮФУ

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

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

 

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

PrevNext


Параллельный ввод-вывод файловых данных (MPI-2)

Для хранения имени файла достаточно использовать массив char[12], а для его пересылки из главного процесса в подчиненные — функцию MPI_Bcast с параметром типа MPI_CHAR.

В первых двух подгруппах (задания MPI6File1–MPI6File16) не требуется настраивать вид файловых данных с помощью функции MPI_File_set_view; достаточно использовать вид по умолчанию, при котором базовые и файловые элементы имеют тип MPI_BYTE, начальное смещение для всех процессов равно 0 и используется представление «native». Это же представление надо указывать и при явной настройке вида файловых данных в заданиях третьей подгруппы (MPI6File17–MPI6File30).

Для определения размера типов MPI_INT и MPI_DOUBLE следует применять функцию MPI_Type_size.

Для указания завершающего пустого промежутка (в заданиях, связанных с настройкой вида файловых данных) следует использовать функцию MPI_Type_create_resized. Альтернативным вариантом является использование специального типа MPI_UB (метки нулевого размера), однако в стандарте MPI-2 этот тип объявлен устаревшим.

Локальный файловый ввод-вывод

MPI6File1°. В главном процессе дано имя существующего файла целых чисел. В каждом из подчиненных процессов дано количество файловых элементов, предназначенных для считывания в этом процессе, и порядковые номера этих элементов (элементы нумеруются от 1). Элементы с некоторыми номерами в исходном файле могут отсутствовать. Используя в каждом процессе требуемое количество вызовов локальной функции MPI_File_read_at, прочесть из файла существующие элементы с указанными номерами и вывести их в том же порядке. Для проверки наличия элемента с указанным порядковым номером можно либо использовать функцию MPI_File_get_size, либо анализировать информацию, возвращенную в параметре типа MPI_Status функции MPI_File_read_at.

MPI6File2°. В главном процессе дано имя файла. В каждом из подчиненных процессов дано количество пар целых чисел и сами пары, в которых первый член равен порядковому номеру файлового элемента, а второй — значению этого файлового элемента (элементы нумеруются от 1, все номера различны и принимают все значения от 1 до некоторого целого числа). Создать новый файл целых чисел с указанным именем и записать в него данные элементы, используя в каждом подчиненном процессе требуемое количество вызовов локальной функции MPI_File_write_at.

MPI6File3°. В главном процессе дано имя существующего файла вещественных чисел, содержащего элементы прямоугольной матрицы размера K × N, где K — число подчиненных процессов. В каждом подчиненном процессе прочесть и вывести элементы R-й строки матрицы, где R — ранг подчиненного процесса (строки нумеруются от 1), используя один вызов локальной функции MPI_File_read_at. Для определения размера файла использовать функцию MPI_File_get_size.

MPI6File4°. В главном процессе дано имя файла, в каждом из подчиненных процессов дано R вещественных чисел, где R — ранг процесса. Создать новый файл вещественных чисел с указанным именем и записать в него данные элементы в порядке возрастания рангов содержащих их процессов. Использовать в каждом подчиненном процессе один вызов локальной функции MPI_File_write_at.

MPI6File5°. В главном процессе дано имя существующего файла целых чисел. Файл обязательно содержит все целые числа в диапазоне от 1 до K, где K — максимальный ранг процесса. В каждом подчиненном процессе прочесть и вывести два фрагмента файловых данных: первый содержит начальную часть элементов до первого элемента, равного рангу процесса (включая этот элемент), второй содержит завершающую часть файловых элементов и имеет тот же размер, что и первый фрагмент. Элементы в каждом фрагменте выводятся в порядке их следования в файле. Использовать в каждом подчиненном процессе необходимое количество вызовов локальной функции MPI_File_read (без применения массивов), а также вызовы функций MPI_File_get_position для определения размера первого фрагмента и MPI_File_seek с параметром MPI_SEEK_END для перемещения к началу второго фрагмента.

MPI6File6°. В главном процессе дано имя файла, в каждом из подчиненных процессов дано целое число. Создать новый файл целых чисел с указанным именем и записать в него K подряд идущих копий каждого числа, где K равно количеству подчиненных процессов. Порядок следования чисел в файле должен быть обратным порядку подчиненных процессов (K копий числа из процесса 1 должны находиться в конце файла, перед ними должны располагаться K копий числа из процесса 2, и т. д.). Использовать в каждом подчиненном процессе один вызов локальной функции MPI_File_write, а также функцию MPI_File_seek с параметром MPI_SEEK_SET.

MPI6File7°. В главном процессе дано имя существующего файла вещественных чисел. Известно, что сумма значений всех файловых элементов превосходит K, где K — количество подчиненных процессов. В каждом подчиненном процессе считывать начальные элементы файла, пока сумма их значений не превысит ранг процесса, после чего вывести найденную сумму S и количество N прочитанных чисел. После этого дополнительно прочесть и вывести значения N последних файловых элементов (в порядке их следования в файле). Использовать в каждом подчиненном процессе необходимое количество вызовов локальной функции MPI_File_read (без применения массивов), а также вызовы функций MPI_File_get_position для определения N и MPI_File_seek с параметром MPI_SEEK_END для перемещения к началу фрагмента из N последних файловых элементов.

MPI6File8°. В главном процессе дано имя файла, в каждом из подчиненных процессов дано вещественное число. Создать новый файл вещественных чисел с указанным именем и записать в него R подряд идущих копий каждого числа, где R равно рангу процесса, в котором дано это число. Порядок следования чисел в файле должен быть обратным порядку подчиненных процессов (в конце файла должно находиться единственное число из процесса 1, перед ним должны располагаться две копии числа из процесса 2, и т. д.). Использовать в каждом подчиненном процессе один вызов локальной функции MPI_File_write, а также функцию MPI_File_seek с параметром MPI_SEEK_SET.

Коллективный файловый ввод-вывод

MPI6File9°. В главном процессе дано имя существующего файла целых чисел. В каждом процессе прочесть и вывести R + 1 элемент файла, начиная с элемента с номером R + 1, где число R равно рангу процесса (0, 1, …). Файловые элементы нумеруются от 1; таким образом, в процессе ранга 0 требуется прочесть и вывести только начальный файловый элемент, в процессе ранга 1 — два следующих файловых элемента, в процессе ранга 2 — три элемента, начиная с третьего, и т. д. Если файл содержит недостаточное количество элементов, то в некоторых процессах число выведенных элементов может быть меньше требуемого. Использовать один вызов коллективной функции MPI_File_read_all, а также функцию MPI_File_seek с параметром MPI_SEEK_SET и функцию MPI_File_get_size для определения размера исходного файла.

Примечание. В реализации MPICH2 версии 1.3 функция MPI_File_read_all не позволяет определить количество фактически считанных файловых элементов на основе информации, содержащейся в параметре типа MPI_Status: в этом параметре количество прочитанных элементов всегда равно требуемому, а при недостаточном количестве файловых элементов в завершающую часть выходного массива записываются нулевые значения.

MPI6File10°. В главном процессе дано имя файла, в каждом из подчиненных процессов дан набор из R целых чисел, где R — ранг процесса (1, 2, …). Создать новый файл целых чисел с указанным именем и записать в него все данные числа в порядке их следования (процессы перебираются в порядке возрастания их рангов). Использовать один вызов коллективной функции MPI_File_write_all (для всех процессов, в том числе и для процесса ранга 0), а также функцию MPI_File_seek с параметром MPI_SEEK_SET.

MPI6File11°. В главном процессе дано имя существующего файла вещественных чисел. Кроме того, в каждом процессе дано целое число, равное либо 0, либо порядковому номеру одного из существующих файловых элементов (элементы нумеруются от 1). Используя функцию MPI_Comm_split, создать новый коммуникатор, содержащий только те процессы, в которых дано число, отличное от 0, и с помощью коллективной функции MPI_File_read_at_all прочесть и вывести в каждом процессе из этого коммуникатора элемент, расположенный в позиции с указанным порядковым номером.

MPI6File12°. В главном процессе дано имя существующего файла вещественных чисел. Кроме того, в каждом процессе дано целое число, равное либо 0, либо порядковому номеру одного из существующих файловых элементов (элементы нумеруются от 1). Используя функцию MPI_Comm_split, создать новый коммуникатор, содержащий только те процессы, в которых дано число, отличное от 0, и с помощью коллективной функции MPI_File_write_at_all заменить исходное значение файлового элемента в позиции с указанным порядковым номером на значение ранга процесса в новом коммуникаторе (преобразовав ранг в вещественное число).

MPI6File13°. В главном процессе дано имя существующего файла целых чисел. Кроме того, в каждом процессе дано целое число, равное либо 0, либо 1. Используя функцию MPI_Comm_split, создать новый коммуникатор, содержащий только те процессы, в которых дано число 1, и с помощью коллективной функции MPI_File_read_ordered прочесть и вывести в каждом процессе из этого коммуникатора R + 1 элемент исходного файла, где R — ранг процесса в новом коммуникаторе (элементы считываются последовательно: один элемент в процессе 0, два следующих элемента — в процессе 1, три следующих — в процессе 2, и т. д.). Если файл содержит недостаточное количество элементов, то в некоторых процессах число выведенных элементов N может быть меньше требуемого или даже равно нулю. В каждом процессе, входящем в новый коммуникатор, дополнительно вывести количество N фактически прочитанных элементов и новое значение P коллективного файлового указателя. Для определения количества прочитанных элементов N использовать информацию, возвращенную в параметре типа MPI_Status функции MPI_File_read_ordered, для нахождения значения P использовать функцию MPI_File_get_position_shared (во всех процессах значение P должно быть одинаковым).

MPI6File14°. В главном процессе дано имя файла. Кроме того, в каждом процессе дано целое число N. Создать новый файл целых чисел с указанным именем. Используя функцию MPI_Comm_split, создать новый коммуникатор, содержащий только те процессы, в которых число N не равно 0, и с помощью коллективной функции MPI_File_write_ordered записать в файл K подряд идущих копий каждого из чисел N, где K равно количеству процессов в новом коммуникаторе, а числа располагаются в порядке возрастания рангов содержащих их процессов.

MPI6File15°. В главном процессе дано имя существующего файла целых чисел, содержащего не менее K элементов, где K — количество процессов. С помощью функции MPI_Comm_split создать новый коммуникатор, содержащий только процессы с нечетным рангом (1, 3, …). Используя по одному вызову коллективных функций MPI_File_seek_shared и MPI_File_read_ordered, прочесть и вывести в каждом процессе из нового коммуникатора по 2 элемента исходного файла, причем предпоследний и последний файловые элементы должны считываться и выводиться (в указанном порядке) в процессе с рангом 1 в исходном коммуникаторе MPI_COMM_WORLD, четвертый и третий с конца элементы — в процессе с рангом 3, и т. д.

Указание. Для того чтобы обеспечить требуемый порядок считывания данных в функции MPI_File_read_ordered, необходимо изменить в созданном коммуникаторе порядок следования процессов на противоположный (по сравнению с исходным порядком в коммуникаторе MPI_COMM_WORLD).

MPI6File16°. В главном процессе дано имя файла. Кроме того, в каждом процессе дано целое число N (≥ 0) и N вещественных чисел. Создать новый файл вещественных чисел с указанным именем. Используя функцию MPI_Comm_split, создать новый коммуникатор, содержащий только те процессы, в которых число N не равно 0, и с помощью единственного вызова коллективной функции MPI_File_write_ordered записать в файл все вещественные числа в порядке, обратном их следованию в наборе исходных данных: вначале записываются (в обратном порядке) все числа из процесса с наибольшим рангом в коммуникаторе MPI_COMM_WORLD, затем все числа из процесса с предыдущим рангом, и т. д.

Указание. Для того чтобы обеспечить требуемый порядок записи данных в функции MPI_File_write_ordered, необходимо изменить в созданном коммуникаторе порядок следования процессов на противоположный (по сравнению с исходным порядком в коммуникаторе MPI_COMM_WORLD).

Настройка вида файловых данных

MPI6File17°. В главном процессе дано имя существующего файла целых чисел, содержащего 2K элементов, где K — количество процессов. Используя единственный вызов коллективной функции MPI_File_read_all (и не применяя функцию MPI_File_seek), прочесть и вывести по 2 элемента в каждом процессе, перебирая элементы в порядке их следования в файле. Для этого предварительно с помощью функции MPI_File_set_view определить новый вид данных с базовым типом MPI_INT, таким же файловым типом и подходящим смещением (своим для каждого процесса).

MPI6File18°. В главном процессе дано имя существующего файла целых чисел, содержащего элементы прямоугольной матрицы размера K × 5, где K — количество процессов. Кроме того, в каждом процессе дано целое число N (1 ≤ N ≤ 5) — порядковый номер выделенного элемента в некоторой строке матрицы (элементы в строке нумеруются от 1), причем с процессом ранга 0 связывается первая строка матрицы, с процессом ранга 1 — вторая строка, и т. д. Используя единственный вызов коллективной функции MPI_File_write_at_all со вторым параметром, равным N − 1, изменить в каждой строке исходной матрицы выделенный элемент, заменив его значение на ранг связанного с ним процесса (выделенный элемент в первой строке следует заменить на 0, во второй строке — на 1, и т. д.). Для этого предварительно с помощью функции MPI_File_set_view определить новый вид данных с базовым типом MPI_INT, таким же файловым типом и подходящим смещением (своим для каждого процесса).

MPI6File19°. В главном процессе дано имя существующего файла вещественных чисел, содержащего элементы прямоугольной матрицы размера K × 6, где K — количество процессов. Кроме того, в каждом процессе дано целое число N (1 ≤ N ≤ 6) — порядковый номер выделенного элемента в некоторой строке матрицы (элементы в строке нумеруются от 1), причем с процессом ранга 0 связывается последняя строка матрицы, с процессом ранга 1 — предпоследняя строка, и т. д. Используя единственный вызов коллективной функции MPI_File_read_at_all со вторым параметром, равным N − 1, прочесть в каждой строке исходной матрицы выделенный элемент и вывести его значение в соответствующем процессе (выделенный элемент в первой строке следует вывести в последнем процессе, во второй строке — в предпоследнем процессе, и т. д.). Для этого предварительно с помощью функции MPI_File_set_view определить новый вид данных с базовым типом MPI_DOUBLE, таким же файловым типом и подходящим смещением (своим для каждого процесса).

MPI6File20°. В главном процессе дано имя файла. Кроме того, в каждом процессе дан набор из R + 1 вещественного числа, где R — ранг процесса (0, 1, …). Создать новый файл вещественных чисел с указанным именем. Используя единственный вызов коллективной функции MPI_File_write_all (и не применяя функцию MPI_File_seek), записать в файл все данные числа в порядке, обратном их следованию в исходном наборе: вначале записываются (в обратном порядке) все числа из процесса с наибольшим рангом, затем все числа из процесса с предыдущим рангом, и т. д. Для этого предварительно с помощью функции MPI_File_set_view определить новый вид данных с базовым типом MPI_DOUBLE, таким же файловым типом и подходящим смещением (своим для каждого процесса).

MPI6File21°. В главном процессе дано имя существующего файла целых чисел, содержащего 3K элементов, где K — количество процессов. В каждом процессе прочесть и вывести три элемента A, B, C, расположенных в исходном файле в следующем порядке (индекс указывает ранг процесса): A0, A1, …, AK-1, B0, B1, …, BK-1, C0, C1, …, CK-1. Для этого использовать единственный вызов коллективной функции MPI_File_read_all, предварительно определив новый файловый вид данных с базовым типом MPI_INT, подходящим смещением (своим для каждого процесса) и новым файловым типом, состоящим из одного целочисленного элемента и завершающего пустого промежутка, размер которого равен протяженности набора из K − 1 целого числа.

MPI6File22°. В главном процессе дано имя файла. Кроме того, в каждом процессе дано по 3 целых числа: A, B, C. Количество процессов равно K. Создать новый файл целых чисел с указанным именем и записать в него исходные числа в следующем порядке (индекс указывает ранг процесса): AK-1, AK-2, …, A0, BK-1, BK-2, …, B0, CK-1, CK-2, …, C0. Для этого использовать единственный вызов коллективной функции MPI_File_write_all, предварительно определив новый файловый вид данных с базовым типом MPI_INT, подходящим смещением (своим для каждого процесса) и новым файловым типом, состоящим из одного целочисленного элемента и завершающего пустого промежутка, размер которого равен протяженности набора из K − 1 целого числа.

MPI6File23°. В главном процессе дано имя существующего файла вещественных чисел, содержащего 6K элементов, где K — количество процессов. В каждом процессе прочесть и вывести шесть элементов A, B, C, D, E, F, расположенных в исходном файле в следующем порядке (индекс указывает ранг процесса): A0, B0, C0, A1, B1, C1, …, AK-1, BK-1, CK-1, D0, E0, F0, D1, E1, F1, …, DK-1, EK-1, FK-1. Для этого использовать единственный вызов коллективной функции MPI_File_read_all, предварительно определив новый файловый вид данных с базовым типом MPI_DOUBLE, подходящим смещением (своим для каждого процесса) и новым файловым типом, состоящим из трех вещественных элементов и завершающего пустого промежутка подходящего размера.

MPI6File24°. В главном процессе дано имя файла. Кроме того, в каждом процессе дано по 4 вещественных числа: A, B, C, D. Количество процессов равно K. Создать новый файл вещественных чисел с указанным именем и записать в него исходные числа в следующем порядке (индекс указывает ранг процесса): AK-1, BK-1, AK-2, BK-2, …, A0, B0, CK-1, DK-1, CK-2, DK-2, …, C0, D0. Для этого использовать единственный вызов коллективной функции MPI_File_write_all, предварительно определив новый файловый вид данных с базовым типом MPI_DOUBLE, подходящим смещением (своим для каждого процесса) и новым файловым типом, состоящим из двух вещественных элементов и завершающего пустого промежутка подходящего размера.

MPI6File25°. В главном процессе дано имя файла. Кроме того, в процессе ранга R (R = 0, 1, …, K − 1, где K — количество процессов) дано 3·(R + 1) целых чисел: в процессе 0 даны 3 числа A, B, C, в процессе 1 — 6 чисел A, A’, B, B’, C, C’, в процессе 2 — 9 чисел A, A’, A’’, B, B’, B’’, C, C’, C’’, и т. д. Создать новый файл целых чисел с указанным именем и записать в него исходные числа в следующем порядке (индекс указывает ранг процесса): A0, A1, A1, A2, A2, A’’2, …, B0, B1, B1, B2, B2, B’’2, … . Для этого использовать единственный вызов коллективной функции MPI_File_write_all, предварительно определив новый файловый вид данных с базовым типом MPI_INT, подходящим смещением (своим для каждого процесса) и новым файловым типом (своим для каждого процесса), состоящим из R + 1 целого элемента и завершающего пустого промежутка подходящего размера.

MPI6File26°. В главном процессе дано имя файла. Кроме того, в каждом процессе дано по 4 вещественных числа: A, B, C, D. Количество процессов равно K. Создать новый файл вещественных чисел с указанным именем и записать в него исходные числа в следующем порядке (индекс указывает ранг процесса): A0, A1, …, AK-1, BK-1, …, B1, B0, C0, C1, …, CK-1, DK-1, …, D0. Для этого использовать единственный вызов коллективной функции MPI_File_write_all, предварительно определив новый файловый вид данных с базовым типом MPI_DOUBLE, подходящим смещением (своим для каждого процесса) и новым файловым типом, состоящим из двух вещественных элементов (с дополнительным пустым промежутком между этими элементами) и завершающего пустого промежутка подходящего размера.

MPI6File27°. В главном процессе дано имя существующего файла вещественных чисел, содержащего элементы прямоугольной матрицы размера (K/2) × K, где K — количество процессов (четное число). В процессе ранга R, R = 0, …, K − 1, прочесть и вывести элементы столбца исходной матрицы с номером R + 1 (столбцы нумеруются от 1). Для этого использовать единственный вызов функции MPI_File_read_all, предварительно определив новый файловый вид данных с базовым типом MPI_DOUBLE, подходящим смещением (своим для каждого процесса) и новым файловым типом, состоящим из вещественного элемента и завершающего пустого промежутка подходящего размера.

MPI6File28°. В главном процессе дано имя файла. Кроме того, в каждом процессе дано целое число N и K/2 вещественных чисел, где K — количество процессов (четное число). Числа N для всех процессов различны и лежат в диапазоне от 1 до K. Создать новый файл вещественных чисел с указанным именем и записать в него матрицу размера (K/2) × K, причем каждый процесс должен записать свой набор вещественных чисел в столбец матрицы с порядковым номером N (столбцы нумеруются от 1). Для этого использовать единственный вызов коллективной функции MPI_File_write_all, предварительно определив новый файловый вид данных с базовым типом MPI_DOUBLE, подходящим смещением (своим для каждого процесса) и новым файловым типом, состоящим из вещественного элемента и завершающего пустого промежутка подходящего размера.

MPI6File29°. В главном процессе дано имя существующего файла целых чисел, содержащего элементы блочной прямоугольной матрицы. Размер матрицы в блоках равен (K/3) × 3, где K — количество процессов (число K кратно 3). Каждый блок представляет собой квадратную матрицу порядка N (значение N может лежать в диапазоне от 2 до 5). В каждом процессе требуется прочесть и вывести один блок исходной матрицы, перебирая блоки по строкам. Для этого использовать единственный вызов функции MPI_File_read_all, предварительно определив новый файловый вид данных с базовым типом MPI_INT, подходящим смещением (своим для каждого процесса) и новым файловым типом, состоящим из N целочисленных элементов и завершающего пустого промежутка подходящего размера. Для определения числа N использовать размер исходного файла, получив его с помощью функции MPI_File_get_size.

MPI6File30°. В главном процессе дано имя файла и число N, которое может лежать в диапазоне от 2 до 5. Кроме того, в каждом процессе даны два целых числа I и J, определяющие позицию (номер строки и столбца) некоторого квадратного блока блочной прямоугольной матрицы размера (K/3) × 3 блоков, где K — количество процессов (число K кратно 3). Значения I лежат в диапазоне от 1 до K/3, значения J лежат в диапазоне от 1 до 3; все процессы содержат различные позиции блоков. Каждый блок представляет собой квадратную матрицу целых чисел порядка N. Создать новый файл целых чисел с указанным именем и записать в него блочную матрицу размера (K/3) × 3, причем каждый процесс должен записать в матрицу блок в позиции (IJ), а все элементы блока, записанного процессом ранга R (R = 0, 1, …, K − 1), должны быть равны числу R. Для этого использовать единственный вызов функции MPI_File_write_all, предварительно определив новый файловый вид данных с базовым типом MPI_INT, подходящим смещением (своим для каждого процесса) и новым файловым типом, состоящим из N целочисленных элементов и завершающего пустого промежутка подходящего размера. Для передачи значения N во все процессы использовать коллективную функцию MPI_Bcast.


PrevNext

 

Рейтинг@Mail.ru

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

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