Научная статья на тему 'Выбор функции распределения состояний при параллельной проверке модели'

Выбор функции распределения состояний при параллельной проверке модели Текст научной статьи по специальности «Математика»

CC BY
129
22
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ПАРАЛЛЕЛЬНЫЕ ВЫЧИСЛЕНИЯ

Аннотация научной статьи по математике, автор научной работы — Коротков И. А., Крищенко В. А.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Выбор функции распределения состояний при параллельной проверке модели»

НАУКА и ОБРАЗОВАНИЕ

Эл № ФС77 - 30569. Государственная регистрация №0421100025. ГББМ 1994-0408

Выбор функции распределения состояний при параллельной проверке модели 77-30569/342044

# 03, март 2012

И. А. Коротков, В. А. Крищенко

УДК 004.021

МГТУ им. Н.Э. Баумана [email protected]

Введение

Проверка модели — автоматический формальный подход, при котором на основе конечной дискретной модели строится полное пространство состояний и на нем проверяется набор интересующих нас утверждений [1]. Основной проблемой данного метода является быстрый рост числа состояний при росте сложности модели.

В настоящий момент на практике применяется ряд оптимизаций, позволяющих сократить как число состояний, так и требуемый для их хранения объем ОЗУ: сокращение частных порядков [1], битовое хэширование без обнаружения коллизий [2], сжатие состояний. Однако, данные меры либо дают небольшой и плохо масштабируемый прирост, либо приводят к потенциальным потерям состояний при обходе. Альтернативным подходом является параллельная генерация состояний с их распределенным хранением по узлам вычислительного кластера. При этом от выбора функции распределения состояний между узлами зависит число обменов информации между узлами и общее время проверки модели. В данной работе рассматривается вопрос выбора такой функции при разработке средства проверки моделей, использующего для своей работы МР1-кластер.

Статья организована следующим образом. В разд. 1 дано формальное определение модели и проверяемой спецификации. В разд. 2 приведено описание языка описания моделей в создаваемой системе. В разд. 3 описан общий алгоритм параллельной генерации состояний, а в разд. 4 приведена предлагаемая функции разбиения пространства состояний. Наконец, в разд. 5 описан используемая для экспериментов система, а в разд. 6 представлены результаты экспериментов.

1. Проверка конечных моделей

Пространство состояний детерминированной системы, например, моделируемой программы, можно формализовать в виде модели Крипке [1]. Моделью Крипке M над множеством атомарных высказываний AP называют четверку (S, S0, R, L), где:

• S — конечное множество состояний;

• So Е S — множество начальных состояний;

• R Е S х S — отношение переходов, которые обязано быть тотальным, т.е. для каждого состояния s Е S должно существовать такое состояние s' Е S, что имеет место R(s, s');

• L: S ^ 2AP — функция, которая помечает каждое состояние множеством атомарных высказываний, истинных в этом состоянии.

Путь в модели M из состояния s — это бесконечная последовательность состояний п = s0si..., такая, что so = s и для всех i > 0 выполняется R(s^ si+1).

Моделируемая программа в каждом своем состоянии описывается набором значений переменных V = {v0,v1,...}, принимающих значения на конечном множестве D (домене интерпретации) и описывающих отдельные компоненты модели и взаимодействие между ними. Множество AP состоит из утверждений вида vi = di, где di Е D. Таким образом, каждое состояние s в M представляет собой отображение V ^ D.

Отношение R определяется следующим образом. Пусть имеются два состояния, s1 и s2. Если в s1 имеется компонент, который может выполнить атомарный переход (изменение значений своих переменных), в результате выполнения которого система будет находиться в состоянии s2, тогда состояния s1 и s2 связаны отношением перехода: (s1, s2) Е R. В случае, если нет такого состояния s2, для которого бы выполнялось R(s1, s2), полагается R(s1, s1), т.е. «тупиковое» состояние связано отношение перехода само с собой.

Для формализации проверяемых на модели M утверждений обычно используются временные логики [1]. Однако, для проверки моделей программных систем наиболее актуальны два вида высказываний:

• утверждение о постоянном выполнении некоего условия в заданной точке компонента, что является аналогом конструкции assert при программировании;

• утверждение о завершении работы модели или ее функционировании в вечном цикле, что важно при поиске тупиков в программной системе.

2. Язык описания модели

Наиболее распространенным средством проверки конечных моделей является система SPIN, использующее для описания исходной модели язык Promela [3]. Разрабатываемая в рамках данной работы система так же использует подмножество языка Promela для описания моделей.

Модель на языке Promela описывается в виде набора процессов (компонент модели), состоящих из последовательности команд. Каждый процесс имеет свой набор локальных переменных, в том числе счетчик команд. Для взаимодействия между процессами могут использоваться глобальные переменные и очереди сообщений. Каждая команда имеет свое условие выполнимости, и процесс считается заблокированным, если условие выполнимости его текущей команды не выполнено.

Пример описания модели семафора Дейкстры и трех захватывающих его процессов в нотации языка Promela приведен ниже. Для данной модели представляет интерес утверждение о «вечном» выполнении модели, что будет свидетельствовать об отсутствии тупиков.

mtype { p, v };

chan sema = [0] of { mtype };

active proctype dijkstra()

{ byte count = 1;

do

:: (count == 1) -> sema!p; count-:: (count == 0) -> sema?v; count++ od

}

active [3] proctype concurent_user()

{ do

:: enter: sema?p; /* вход в критическую секцию */

crit: skip; /* критическая секция */

leave: sema!v; /* выход из критической секции */

od

}

3. Параллельная генерация состояний

При росте числа и сложности компонент моделируемого программной системы в случае наблюдается комбинаторный рост числа возможных состояний. Поскольку граф состояний в общем случае имеет циклы, необходимо хранить множество посещенных состояний, которое быстро перестает помещаться в ОЗУ одной машины, а использование внешней памяти приведет к увеличению времени проверки на 3-4 порядка. В силу этого для проверки больших моделей лучше использовать вычислительный кластер.

Возможны два подхода к использованию ресурсов вычислительного кластера при генерации состояний. При распределенном хранилище состояний состояния генерирует только один узел, а для хранения используются все узлы. Каждое состояние имеет свой однозначно вычислимый номер узла и для проверки, принадлежит ли следующее состояние множеству посещенных, делается синхронный удаленный вызов хранящего это состояние узла.

При параллельной генерации состояний каждый узел кластера является одновременно хранилищем и генератором. Если новое состояние принадлежит другому узлу (переход — внешний), то оно высылается ему асинхронным удаленным вызовом. На рис. 1 показан пример обхода графа при данном подходе. Цифры рядом с состояниями обозначают локальный порядок генерации (в пределах данного узла).

Несмотря на очевидные преимущества, второй подход имеет свой недостаток: отсутствие какого-либо глобального порядка обхода состояний. В работе была выбрана параллельная генерации состояний. Каждый узел, кроме генерации состояний, также проверяет утверждения.

4. Функция распределения состояний между узлами

Одной из основных проблем параллельной генерации состояний является выбор функции распределения состояний между узлами. Эта функция ставит в соответствие каждому состоянию индекс узла, отвечающего за хранение данного состояний. В случае параллельной генерации состояний она должна иметь следующие свойства:

• зависеть только от битового представления самого состояния, поскольку одно и то же состояние может генерироваться различными узлами в результате различных переходов;

• распределять состояния между узлами достаточно равномерно, в противном случае часть памяти у некоторых узлов будет простаивать;

• обладать свойством локальности относительно переходов между состояниями — по возможности новые состояния должны принадлежать тому же узлу, что и исходное.

Наиболее простым подходом является использование хэш-функции от битового представление состояния ^ в качестве индекса хранящего его узла. Это обеспечит первые два условия: если выбрана подходящая хэш-функция, распределение будет достаточно равномерным. Однако, третье условие при этом не соблюдается: все новые состояния имеют равные шансы принадлежать любому узлу независимо того, на каком узле они были сгенерированы.

Пусть число узлов — N, состояний — Б, переходов между ними — Т .В случае равномерного распределения состояний между узлами вероятность того, что следующее состояние будет принадлежать текущему узлу, равняется 1/N. Следовательно, вероятность того, что потребуется удаленный вызов, равна 1 — 1/N, а среднее число удаленных вызовов в течение всей генерации составит

Я = Т (1 — -1), (1)

что при больших значениях стремится к Т.

Высокое число удаленных вызовов негативно отражаются на производительности, поэтому необходимо найти более удачную функцию распределения состояний, которая бы удовлетворяла условию локальности. Одна из возможных идей заключается в использовании хэш-код не от всего состояния в, а от некоторой его части §.

Битовое представление состояния в общем случае представляет собой набор значений переменных, описывающих состояние отдельных компонент моделируемой системы и значения общих переменных, описывающих взаимодействие между ними.

Пусть Р — число таких компонент (процессов в нотации Рготе1а) в модели, к — среднее число компонент, состояние которых меняется при переходе. Для языка Рготе1а 1 ~ к < 2 , поскольку взаимодействие между более чем двумя процессами (компонентами моделируемой системы) нереализуемо, но для двух процессов есть возможность синхронной передачи сообщения, при которой оба меняют свое состояние. Последняя возможность используется обычно редко, поэтому для большинства моделей к достаточно близко к 1.

Таким образом, битовое представления состояния естественным образом разделяется на (Р + 1) область, с учетом области глобальных переменных. При этом Р из них меняются почти независимо друг от друга при условии к ~ 1, и в качестве хэшируемого подсостояния § можно выбрать первые (или произвольные) р областей, хранящих локальные состояния первых р процессов.

Если предположить, что каждый процесс рг участвует примерно в равной доле переходов, то для произвольного наперед заданного процесса вероятность участия в данном переходе составит к/р, а для р процессов при к ~ 1 либо небольшом р — р. При условии, что множество возможных локальных состояний процесса отображается на множество узлов равномерным образом, вероятность удаленного вызова при изменении локального состояния

процесса (т.е. при его участии в переходе), по аналогии с предыдущими рассуждениями, составит 1 — 1/N. Количество удаленных вызовов во всей модели, таким образом, равняется

Qp = крТ С1 — N) (2)

и с ростом N стремится к kpT. При количестве процессов P = 10, к = 1,1 и р = 2, число удаленных вызовов уменьшается примерно в 4 раза в сравнении с «наивным» подходом.

Выбор меньших значений р приводит к меньшему числу удаленных вызовов, однако увеличивает неравномерность распределения, поэтому его значение следует выбирать из баланса между требуемой равномерностью распределения состояний и выигрышем во времени за счет уменьшения числа вызовов.

Пусть i-й процесс Pi имеет Wi возможных значений локального состояний, т.е. число допустимых комбинаций значений его переменных составляет wi. Объединение локальных состояний р процессов тогда имеет не более Wp = ЛP=1 wi возможных значений. Число значений может быть меньше Wp, поскольку в общем случае не все комбинации являются допустимыми. Значение р должно обеспечивать условие Wp ^ N, иначе, особенно при Wp ~ N, распределение будет неравномерным даже при удачном выборе хэш-функции, а при Wp < N память некоторых узлов не будет использоваться вообще, так как число возможных значений хэш-функции будем меньше числа узлов.

5. Реализация экспериментальной системы

Было создано программное средство для параллельной проверки состояний с распределенной генерацией, поддерживающее основные возможности языка Promela для описания модели и проверку утверждений с функцией assert и поиском тупиковых состояний.

Разработанное ПО работает следующим образом (рис. 2). Исходная модель на Promela считывается и транслируется во внутренний граф команд для каждого процесса, который

Описание модели Функция переходов модели

Вычислительный кластер

Рис. 2. Функциональная схема процесса генерации кода по описанию модели

затем минимизируется. С целью достижения скорости генерации состояний, сравнимой со скоростью системы SPIN, по полученным графам команд генерируется код на языке C, выполняющий вычисление функции переходов модели Next (s) = (s' : R(s, s')} и функции проверки состояний Assert(s) : S ^ (0,1}. В качестве платформы для параллельных вычислений в системе используется вычислительный кластер, поддерживающий стандарт интерфейса параллельного программирования MPI.

6. Результаты экспериментов

В качестве исходных данных для экспериментов были взяты две модели: выбора лидера и «обедающие философы» с числом компонент P = 6. Для проведения экспериментов использовался MPI-кластер из 20 узлов, имеющих 4 Гб ОЗУ и 4 ЦПУ Intel Xeon 5120 1.86 ГГц каждый.

Результаты экспериментов, в которых предлагаемое распределение с р = 1, 2, 3 сравнивается с наивным, представлены в табл. 1 и 2.

Таблица 1

Сравнение распределений (алгоритм выбора лидера)

р Доля внешних переходов, % Неравномерность распределения, % Время простоя, сек Общее время работы, сек

1 16 66,3 29 43

2 36 12,8 65 84

3 52 1,2 86 107

- 87 0,1 127 164

Таблица 2

Сравнение распределений («обедающие философы»)

Р 1 Доля внешних переходов, % 17 Неравномерность распределения, % 89,4 Время простоя, сек 3 Общее время работы, сек 14

2 35 29,6 7 21

3 51 2,0 15 40

- 88 0,1 50 75

Проблемные значения выделены жирным начертанием. В таблицах приведены следующие величины:

• доля внешних переходов — отношение числа удаленных вызовов (суммарно на всех узлах) к числу переходов Т;

• неравномерность распределения — отношение среднеквадратичного отклонения к среднему для последовательности ш\, ш2,. .., т^, где т* — число состояний, хранимых узлом г;

• время простоя при ожидании сообщений от других узлов (сетевые задержки);

• общее время работы.

Из приведенных результатов можно сделать следующие выводы.

1. Выбор распределения между узлами важен, поскольку время простоя за счет удаленных вызовов составляет существенного часть от времени выполнения.

2. При «наивном» подходе к распределению состояний число удаленных вызовов близко к числу всех переходов, как и следует из (1).

3. Предлагаемый способ распределения состояний по первым р процессам позволяет уменьшить число удаленных вызовов и время выполнения по сравнению с «наивным» подходом в соответствии с (2).

4. Необходим подбор параметра р в соответствии со свойствами проверяемой модели (P, Wi) для обеспечения требуемого уровня равномерности распределения состояний. Значения р = 1 в приведенных экспериментах оказалось недостаточно, поскольку неравномерность до 90% означает, что большая часть памяти некоторых узлов не используется. С другой стороны, при р = 3 доля переходов уже составляет более половины от своего значения при «наивном» подходе и преимущество над ним уменьшается.

Заключение

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

Список литературы

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

1. Кларк Э.М., Грамберг О., Пелед Д. Верификация моделей программ. Москва: МЦНМО, 2002. 416 с.

2. Holzmann G.J. An Analysis of Bitstate Hashing // Formal Methods in System Design. 1998. Vol. 13, N3. Pp. 287-305.

3. Holzmann G.J. The model checker SPIN // IEEE Transactions on Software Engineering. 1997. Vol. 23. Pp. 279-295.

SCIENCE and EDUCATION

El № FS77 - 30569. №0421100025. ISSN 1994-0408

Choosing a state partitioning function for parallel assertion-based model checking 77-30569/342044

# 03, March 2012

I.A. Korotkov, W.A. Krishchenko

Bauman Moscow State Technical University

[email protected]

Parallel statespace generation with distributed storage can be used in modelchecking to circumvent limitations set by the amount of memory available. The effectiveness of this method depends on the choice of function used to partition states between computing nodes. We propose a partitioning function that makes verification faster due to reducing the number of remote calls made between nodes. We provide results of experiments made with a prototype of a parallel modelchecking tool.

References

1. KlarkE.M., Gramberg O., PeledD. Model checking. MIT Press, 1999. (Russ. ed.: Klark Je.M., Gramberg O., Peled D. Verifikacija modelej programm: Model Checking. Moscow, MC-NMO, 2002. 416 p.).

2. Holzmann G.J. An Analysis of Bitstate Hashing // Formal Methods in System Design. 1998. Vol. 13, N3. Pp. 287-305.

3. Holzmann G.J. The model checker SPIN // IEEE Transactions on Software Engineering. 1997. Vol. 23. Pp. 279-295.

i Надоели баннеры? Вы всегда можете отключить рекламу.