Автоматизированный анализ корректности MPI-программ на основе определенных пользователем шаблонов ошибочного поведения
Описан подход к построению системы отладки, использующей автоматизированный анализ корректности MPI-приложений. Особенностью системы является дополнение стандартного механизма работы инструментальных средств этого класса возможностью пользователя определять ошибочные ситуации, на наличие которых необходимо проверить программу. Приведены элементы разработанного языка описания шаблонов ошибочного поведения, архитектура и алгоритм работы предлагаемой системы отладки.
Automated correctness analysis of the MPI-programs based on the templates of erroneous behavior defined by an user.pdf MPI (Message Passing Interface) до настоящего момента остается стандартом де-факто при создании программ для вычислительных систем с распределенной памятью. Однако отладка MPI-программ является крайне трудоемким процессом. Существует несколько подходов к построению инструментальных средств обнаружения ошибок в MPI-программах [1; 2. С. 13-15]. Один из перспективных методов отладки - автоматизированный контроль корректности. В противоположность ему диалоговая отладка - наиболее развитый в настоящее время подход - предполагает наблюдение за значениями переменных в каждом из процессов параллельной программы (характерными представителями этой категории средств являются TotalView, Distributed Debugging Tool и интегрированный в Microsoft Visual Studio отладчик mpishim [3. С. 3-7]). Современная тенденция к росту масштабов суперкомпьютеров, а вслед за ними - к увеличению числа ветвей запускаемых параллельных приложений, приводит к тому, что работа с системами диалоговой отладки становится крайне кропотливым процессом. В большинстве систем автоматизированного контроля корректности MPI-программ используется профилировочная библиотека, основанная на стандартном PMPI-интерфейсе [4. С. 63; 5. С. 465466]. Внутри функции-обработчика из данной библиотеки производится некоторый анализ вызова, и управление передается соответствующей PMPI-функции, которая выполняет действия, ожидаемые пользователем. Все MPI-реализации предоставляют PMPI-интерфейс, благодаря чему становится возможным создание такой библиотеки. Проблема использования подхода автоматизированного контроля корректности заключается в следующем. Даже версия стандарта MPI 1.1 насчитывала более 120 процедур и функций. Последующие версии (MPI 2, MPI 3) привнесли еще несколько десятков функций. У подавляющего большинства функций имеются аргументы, на многие из которых MPI-стандарт [6] накладывает определенные ограничения. Для каждого процесса это могут быть как ограничения общего характера (например, «число пересылаемых элементов не может быть отрицательным»), так и зависимые от операций, выполняемых другим процессом (например, номер root-процесса коллективной операции должен совпадать на всех процессах коммуникатора). Кроме того, MPI-стандарт накладывает некоторые ограничения на последовательность вызовов функций. В связи с этим даже правильность всех аргументов вызываемых функций не гарантирует корректность MPI-программы в целом. Как следствие, пользователю нужно соблюдать огромное количество условий при работе с MPI-функциями. Из вышеизложенного можно сделать два вывода: 1) разработка систем, автоматизирующих процесс отладки MPI-программ, абсолютно необходима; 2) заложить в такую систему проверки на все возможные ошибки практически невозможно. Сложность организации в системе автоматизированного контроля корректности проверок на все возможные ошибки MPI-программы - следствие не только очень большого их количества, но и того, что поддерживать такую систему в актуальном состоянии чрезвычайно сложно, поскольку MPI-стандарт регулярно претерпевает обновления. В то же время пользователю далеко не всегда требуется выполнение системой всех возможных проверок на его программе - зачастую он представляет, в каких местах может возникнуть ошибка, а излишние проверки создают дополнительную нагрузку на вычислительную систему. Таким образом, актуальной является задача разработки системы автоматизированного контроля корректности, предоставляющей пользователю возможность самому задавать проверки, которые должна произвести система при исполнении программы. При этом подразумевается не выбор подмножества из имеющихся вариантов, а самостоятельное определение пользователем такого поведения программы, которое должно быть выявлено системой отладки. Плюсом такой системы является также то, что возможно не только обнаруживать логические ошибки, но и осуществлять пользовательские проверки. 1. Язык описания шаблонов Для определения пользователем ошибок, на наличие которых требуется проверить программу, необходимо было разработать некоторый язык описания. Поскольку разрабатываемая система использует подход автоматизированного контроля корректности, то она получает информацию о вызываемых MPI-функциях при помощи профилировочного интерфейса. Следовательно, все, чем может оперировать система, - это имена вызываемых функций, их аргументы и номера MPI-процессов. Эти параметры и легли в основу языка. Для описания ситуации пользователь должен указать: - процессы, участвующие в данной ситуации; - функции, вызываемые (или, наоборот, - не вызванные) каждым из процессов; - условия на значения, принимаемые аргументами функций. При этом отождествлять описываемую ситуацию с логической ошибкой будет не совсем верно, потому что указанная ситуация может возникнуть вследствие нескольких ошибок. Например, пользователь указывает, что один процесс должен вызвать функцию отправки типа точка-точка, а во втором должен отсутствовать соответствующий прием во время работы программы. Такая ситуация может возникнуть из-за того, что в программном коде, выполняемом вторым процессом, либо вообще отсутствует функция приема от первого, либо, не дойдя до нее, второй процесс завис в некоторой другой операции. Эти причины являются двумя различными ошибками, повлекшими одну и ту же ситуацию. Поэтому ситуации, описываемые при помощи данного языка, авторы назвали «шаблонами поведения», а сам язык - «языком описания шаблонов». Ниже приведены элементы языка описания шаблонов. Каждый шаблон пользователь заполняет в отдельном файле, имеющем следующую стандартную структуру: 1. Название шаблона (параметр «Name»). 2. Ключевое слово «Iblock», говорящее о том, что далее следует блок описания процессов. 3. Количество (параметр «N») и, опционально, номера процессов («р1», «р2», ...). При этом можно указать, что в ситуации участвуют все процессы, применив обозначение «n(MPICOMMWORLD)». Пример 1: N=2 p1=0 p2=1 (два процесса с номерами «0» и «1» в коммуникаторе MPI_COMM_ WORLD). 4. Ключевое слово «2block», после которого следуют описания функций. 5. MPI-функции, которые должны вызвать указанные процессы для возникновения ситуации. Каждая функция обозначается как «Fi», где i - номер функции. Указывается обозначенный в предыдущем разделе номер процесса (pj) и через двоеточие - имя MPI-функции без префикса «MPI_». Пример 2: F1=p1:Bsend F2=p2:Recv Для обозначения любой функции из некоторого множества существуют специальные макросы. Так, запись «F1=p1:Send_any» обозначает, что первый процесс вызывает любую из блокирующих операций отправки. Существуют также макросы «(I)PTP» - любая (не)блокирующая операция типа точка-точка, «Coll» - любая коллективная коммуникация, «(I)Recvany» - любая (не)блокирующая операция приема. Пример 3: F1=p1:Send_any F2=p2:Recv_any Для указания того, что во время работы процесса должен отсутствовать вызов определенной функции, введен символ отрицания (!). Другими логическими операциями языка являются конъюнкция (&&) и дизъюнкция (||). Так, если для возникновения ситуации процесс может вызвать блокирующую или неблокирующую операцию отправки, то применяется следующая запись. Пример 4: F1=p1:Send_any^Isend_any Введена также специальная комбинация «Fi=pi:», говорящая о том, что функцию должны вызвать все процессы, участвующие в описываемой ситуации. 6. Ключевое слово «3block», обозначающее начало блока функций. 7. Поскольку в предыдущем разделе все участвующие в ситуации функции были введены при помощи символа «F» с номером, то в этом блоке обращение к ним идет посредством данных обозначений. Общее правило составления условий на аргументы состоит в том, что пользователь указывает функцию, номер ее аргумента и значение, которое должен принимать этот аргумент. При этом в качестве значения можно употреблять конкретное число: «F1(2)=7»; номер процесса: «F1(4)=p1»; значение какого-либо аргумента другой функции: «F1(2)!=F2(2)» или макрос, определенный в стандарте MPI: «F1(4)=MPI_ANY_SOURCE». Условия базируются на логических отношениях равенства «=», неравенства «!=», больше «>» и меньше «
Ключевые слова
MPI-program,
template of erroneous behavior,
correctness analysis,
logical errors,
MPI-программа,
шаблон ошибочного поведения,
анализ корректности,
логические ошибкиАвторы
Афанасьев Константин Евгеньевич | Кемеровский государственный университет | | |
Власенко Андрей Юрьевич | Кемеровский государственный университет | ассистент кафедры ЮНЕСКО по новым информационным технологиям | vlasenko@kemsu.ru |
Всего: 2
Ссылки
Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. СПб. : БХВ-Петербург, 2002. 608 c.
Krammer B., Mueller M., Resch M. MPI application development using the analysis tool MARMOT // Lecture Notes in Computer Science. Berlin : Springer, 2004. V. 3038. P. 464-471.
The MPI Standard. URL: http://www.mcs.anl.gov/research/projects/mpi/standard.html (дата обращения: 9.10.2013).
Власенко А.Ю. Модель масштабируемой системы автоматического контроля корректности параллельных программ // Вестник НГУ. 2009. Т. 7, вып. 4. С. 53-66.
Hilbrich T., Schulz M., de Supinski B.R. MUST: A Scalable Approach to Runtime Error Detection in MPI Programs // Tools for High Performance Computing. Berlin : Springer, 2009. P. 53-66.
Гергель В.П. Введение в методы параллельного программирования. Лабораторная работа 3. Отладка параллельных MPI-программ в среде Microsoft Visual Studio 2005. URL: http://www.software.unn.ac.ru/ccam/mskurs/LAB/RUS/ PPT/CCS_Lab03.pdf (дата обращения: 9.10.2
Ефимкин К.Н., Жукова О.Ф., Крюков В.А. Средства отладки MPI-программ. Анализатор корректности. URL: http://www.keldysh.ru/papers/2006/prep28/prep2006_28.html. 2006 (дата обращения: 12.10.2013).
Афанасьев К.Е., Власенко А.Ю. Семантические ошибки в параллельных программах для систем с распределенной памятью и методы их обнаружения современными средствами отладки // Вестник КемГУ. 2009. Вып. 2. С. 13-20.