SlideShare ist ein Scribd-Unternehmen logo
1 von 11
Downloaden Sie, um offline zu lesen
VivaMP, система выявления ошибок в
коде параллельных программ на
языке С++, использующих OpenMP
Авторы: Алексей Колосов, Андрей Карпов, Евгений Рыжков

Дата: 19.04.2009

В настоящее время программные продукты Viva64 и VivaMP включены в состав PVS-Studio и
более не распространяются как отдельные приложения. Используйте программу PVS-Studio
для получения необходимых возможностей проверки кода.


Аннотация
В статье приводятся результаты исследований ошибок, которые допускают программисты,
использующие С++ и OpenMP. Для автоматического обнаружения этих ошибок предлагается
использование статического анализа. Описывается интегрирующийся в среду Visual Studio
анализатор VivaMP, реализующий поставленную задачу.


1. Введение
По оценкам компании Evans Data, проводящей опросы среди разработчиков ПО, общее
количество программистов в мире к 2009 году составит 17 миллионов человек[1]. На сегодняшний
день 40% из них используют язык С++, причем около 70% разработчиков занимаются разработкой
многопоточных приложений сейчас или планируют начать ее в течение года [2]. По данным того
же опроса, 13,2% этих разработчиков считают, что главной проблемой таких разработок является
нехватка программных средств для создания, тестирования и отладки параллельных приложений.
Следовательно, в решении задачи автоматического поиска ошибок в исходном коде
непосредственно заинтересованы примерно 630.000 программистов.

Целью работы является создание статического анализатора кода, предназначенного для
автоматического обнаружения таких ошибок. В исследовании рассматривался язык C++, поскольку
к коду именно на этом языке чаще всего предъявляются требования высокой
производительности. Так как поддержка технологии OpenMP встроена в Microsoft Visual Studio
2005 и 2008, и некоторые специалисты считают, что именно технология OpenMP вскоре
приобретет наибольшую популярность [3], рассматривалась именно эта технология (помимо C++
применяемая также для языков C и Fortran).

Анализ обзоров отладчиков для параллельных программ показывает, что ситуация в этой сфере
до сих пор далека от идеала. Применительно к отладке программ, написанных на С++ и
использующих OpenMP, как правило, упоминаются TotalView и Intel Thread Checker. Однако, оба
эти инструмента предназначены для динамического использования. До недавнего времени
направление статического анализа OpenMP программ было практически не освоено. В качестве
примера можно привести, пожалуй, только достаточно качественную диагностику, выполняемую
компилятором Sun Studio. Статический анализатор VivaMP заполнил это нишу.
2. Применение статического анализа для отладки параллельных
программ
Большинство существующих на данный момент средств отладки параллельных программ
являются динамическими анализаторами, предполагающими непосредственное выполнение
анализируемой программы. Такой подход имеет свои преимущества, но у него имеются и
недостатки.

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

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

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

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

В анализаторе VivaMP используется анализ с обходом дерева кода (tree walk analysis). Помимо
этого существуют и другие виды статического анализа, предполагающие моделирование
выполнения программы, расчет возможных значений переменных и путей выполнения кода.
Статический анализ как средство диагностики ошибок в параллельных программах был выбран
потому, что данный подход позволяет находить многие ошибки, не диагностируемые
динамическими анализаторами. Теперь рассмотрим сами ошибки подробнее.


3. Диагностируемые ошибки
Список возможных ошибок, не обнаруживаемых компилятором Visual Studio, был составлен в
результате исследования работ, посвященных параллельному программированию с
использованием OpenMP, а также на основе личного опыта авторов. Все ошибки можно
разделить на четыре основные категории:

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

Приведем примеры ошибок каждого вида и их краткое описание.


3.1. Отсутствие ключевого слова parallel
Рассмотрим простейшую ошибку, которая может возникнуть при неправильном написании
директив OpenMP. Поскольку эти директивы имеют достаточно сложный формат, такую ошибку
по тем или иным причинам может допустить любой программист. Пример корректного и
некорректного кода приведен на Рис. 1.

// Некорректно:

#pragma omp for

... // цикл for

// Корректно:

#pragma omp parallel for

... // цикл for

// Корректно:

#pragma omp parallel

{

    #pragma omp for

    ... // цикл for

}

Рис. 1. Пример ошибки, вызванной отсутствием ключевого слова parallel

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


3.2. Неправильное применение блокировок
Если программист использует для синхронизации и/или защиты объекта от одновременной
записи функции вида omp_set_lock, каждый поток должен содержать вызовы соответствующих
функций omp_unset_lock, причем с теми же переменными. Попытка освобождения блокировки,
захваченной другим потоком, или отсутствие вызова разблокирующей функции может привести к
ошибкам во время выполнения программы и бесконечному ожиданию. Рассмотрим пример кода
(см. Рис. 2):

// Некорректно:

omp_lock_t myLock;

omp_init_lock(&myLock);

#pragma omp parallel sections

{

    #pragma omp section

    {

            ...

            omp_set_lock(&myLock);

            ...

    }

    #pragma omp section

    {

            ...

            omp_unset_lock(&myLock);

            ...

    }

}

// Некорректно:

omp_lock_t myLock;

omp_init_lock(&myLock);

#pragma omp parallel sections

{

    #pragma omp section

    {

             ...

             omp_set_lock(&myLock);

             ...
}

    #pragma omp section

    {

          ...

          omp_set_lock(&myLock);

          omp_unset_lock(&myLock);

          ...

    }

}

// Корректно:

omp_lock_t myLock;

omp_init_lock(&myLock);

#pragma omp parallel sections

{

    #pragma omp section

    {

          ...

          omp_set_lock(&myLock);

          ...

          omp_unset_lock(&myLock);

          ...

    }

    #pragma omp section

    {

         ...

         omp_set_lock(&myLock);

         ...

         omp_unset_lock(&myLock);

         ...

    }
}

Рис. 2. Пример некорректного использования блокировок

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

Теперь рассмотрим другую ошибку более подробно и приведем соответствующее правило для
анализатора.


3.3. Незащищенный доступ к общей памяти
Эта ошибка может встретиться в любой параллельной программе, написанной на любом языке.
Также она называется состоянием гонок (race condition) и суть ее заключается в том, что значение
общей переменной, изменяемой одновременно из нескольких потоков, в результате может
оказаться непредсказуемым. Рассмотрим простой пример для С++ и OpenMP (см. Рис. 3):

// Некорректно:

int a = 0;

#pragma omp parallel

{

     a++;

}

// Корректно:

int a = 0;

#pragma omp parallel

{

     #pragma omp atomic

     a++;

}

Рис. 3. Пример состояния гонок

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

К глобальным объектам относительно параллельного блока относятся:

   •   Статические переменные.
   •   Статические члены класса (В версии VivaMP 1.0 не реализовано).
   •   Переменные, объявленные вне параллельного блока.

Объект может быть как переменной простого типа, так и экземпляром класса. К операциям
изменения объекта относится:

   •   Передача объекта в функцию по не константной ссылке.
   •   Передача объекта в функцию по не константному указателю (В версии VivaMP 1.0 не
       реализовано).
   •   Изменение объекта в ходе арифметических операций или операции присваивания.
   •   Вызов у объекта не константного метода.

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

   •   Код не находится в параллельном блоке (нет директивы "parallel").
   •   Модификация объекта защищена директивой "atomic".
   •   Код находится в критической секции, заданной директивой "critical".
   •   Код находится в критической секции, образованной функциями вида omp_set_lock.
   •   Код находится в блоке директивы "master".
   •   Код находится в блоке директивы "single".
   •   К объекту (переменной) применена директива "threadprivate", либо выражение "private",
       "firstprivate", "lastprivate" или "reduction". Это исключение не касается статических (static)
       переменных и статических полей классов, которые всегда являются общими.
   •   Инициализация или модификация объекта осуществляется внутри оператора for (внутри
       самого оператора, а не внутри тела цикла). Такие объекты согласно спецификации
       OpenMP автоматически считаются локальными (private).
   •   Модификация объекта осуществляется внутри секции, заданной директивой section.

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

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

Теперь перейдем к описанию самого анализатора.
4. Анализатор VivaM
              VivaMP
Анализатор VivaMP разработан на основе библиотеки анализа кода VivaCore и вместе с
анализатором Viva64 составляет единую линейку продуктов в области тестирования ресурсоемких
приложений. Viva64 предназначается для поиска ошибок, связанных с переносом 32
                iva64                                                          32-битного ПО
на 64-битные платформы. VivaMP предназначен для проверки параллельных приложений,
       битные
построенных на базе технологии OpenMP. Как и Viva64, VivaMP интегрируется в среду разработки
Visual Studio 2005/2008, добавляя новые команды в интерфейс. Настройка анализатора делается
    al
через стандартный для среды механизм, диагностические сообщения выводятся так же, как
сообщения стандартного компилятора - в окна Error List и Output Window. Помимо это
                                                                                этого
подробное описание ошибок приведено в справочной системе анализатора, интегрирующейся в
справку Visual Studio. Контекстная справка реализована через стандартный механизм среды.
Интерфейс анализатора VivaMP, интегрированного в среду Visual Studio приведе на Рис. 4.
                                                                      приведен
Рис. 4. Интерфейс VivaMP

На данный момент выпущена первая версия анализатора, информацию о которой можно
получить по адресу http://www.viva64.com/vivamp-tool. Первая версия VivaMP диагностирует 19
ошибок, однако, количество собранного материала и результаты экспериментов позволяют
существенно увеличить это число (как минимум в два раза) в последующих версиях. Ниже
перечислены краткие описания диагностируемых ошибок:

   •   Отсутствие ключевого слова "parallel".
   •   Отсутствие ключевого слова "omp".
   •   Отсутствие ключевого слова "for" (каждый поток выполнит цикл полностью, работа не
       будет разделена между потоками).
   •   Вложенное распараллеливание цикла "for".
   •   Отсутствие директивы "ordered" в упорядоченном цикле.
   •   Переопределение числа потоков в параллельном коде.
   •   Несимметричное использование блокирующих/разблокирующих функций.
   •   Зависимость поведения кода от количества выполняющих его потоков (использование
       функции "omp_get_num_threads" в арифметической операции).
   •   Переопределение возможности вложенного распараллеливания в параллельном коде.
   •   Одновременное использование общего ресурса (незащищенный вызов функции).
   •   Использование директивы "flush" для указателей.
   •   Использование директивы "threadprivate". Директива опасна, так как влияет на весь файл.
       Рекомендуется использовать локальные переменные или явно указывать тип доступа в
       каждом параллельном блоке.
   •   Незащищенное объявление статической переменной в параллельном коде.
   •   Незащищенная одновременная операция с переменной.
   •   Одновременное изменение переменной посредством вызова функции.
   •   Одновременное изменение объекта посредством вызова функции.
   •   Переменная ссылочного типа не должна быть объявлена как локальная.
   •   Указатель не может быть локальной переменной.
   •   Переменная, объявленная как "lastprivate", не изменена в лексически последней
       параллельной секции.

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

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


Литература
   1. Timothy Prickett Morgan. Evans Data Cases. Programming Language Popularity:
      [http://www.viva64.com/go.php?url=190], 14.12.2006.
   2. Janel Garvin. Evans Data: Market Situation and Predictions:
      [http://www.viva64.com/go.php?url=191], 8.04.2008
   3. Michael Suess. Why OpenMP is the way to go for parallel programming:
      [http://www.viva64.com/go.php?url=119], 12.08.2006.
4. Е.А. Рыжков, О.С. Середин. Применение технологии статического анализа кода при
   разработке параллельных программ. Известия ТулГУ. Технические науки. Вып.3. - Тула:
   Изд-во ТулГУ, 2008. - 267 с. Стр. 191 - 196.
5. Алексей Колосов, Евгений Рыжков, Андрей Карпов. 32 подводных камня OpenMP при
   программировании на C++. RSDN Magazine #2-2008. Cтр. 3 - 17.

Weitere ähnliche Inhalte

Was ist angesagt?

Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")Tatyanazaxarova
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Tatyanazaxarova
 
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...corehard_by
 
введение в Javascript
введение в Javascriptвведение в Javascript
введение в Javascriptinqubick
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Maksim Grinevich
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокTatyanazaxarova
 
Basics of assertions in automated testing
Basics of assertions in automated testingBasics of assertions in automated testing
Basics of assertions in automated testingÞorgeir Ingvarsson
 
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияТрудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияTatyanazaxarova
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
Keyword-driven framework
Keyword-driven frameworkKeyword-driven framework
Keyword-driven frameworkSQALab
 
Тестировщики Vs Программисты
Тестировщики Vs ПрограммистыТестировщики Vs Программисты
Тестировщики Vs ПрограммистыAndrii Dzynia
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 
20120218 model checking_karpov_lecture02
20120218 model checking_karpov_lecture0220120218 model checking_karpov_lecture02
20120218 model checking_karpov_lecture02Computer Science Club
 
How to Put Automation Engineers Down
How to Put Automation Engineers DownHow to Put Automation Engineers Down
How to Put Automation Engineers DownÞorgeir Ingvarsson
 
Amusing Geometry in Test Automation
Amusing Geometry in Test AutomationAmusing Geometry in Test Automation
Amusing Geometry in Test AutomationÞorgeir Ingvarsson
 
UI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" PatternUI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" PatternÞorgeir Ingvarsson
 
Построение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаПостроение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаTatyanazaxarova
 

Was ist angesagt? (20)

Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
 
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
 
введение в Javascript
введение в Javascriptвведение в Javascript
введение в Javascript
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Basics of assertions in automated testing
Basics of assertions in automated testingBasics of assertions in automated testing
Basics of assertions in automated testing
 
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияТрудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
Keyword-driven framework
Keyword-driven frameworkKeyword-driven framework
Keyword-driven framework
 
Тестировщики Vs Программисты
Тестировщики Vs ПрограммистыТестировщики Vs Программисты
Тестировщики Vs Программисты
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
20120218 model checking_karpov_lecture02
20120218 model checking_karpov_lecture0220120218 model checking_karpov_lecture02
20120218 model checking_karpov_lecture02
 
How to Put Automation Engineers Down
How to Put Automation Engineers DownHow to Put Automation Engineers Down
How to Put Automation Engineers Down
 
Amusing Geometry in Test Automation
Amusing Geometry in Test AutomationAmusing Geometry in Test Automation
Amusing Geometry in Test Automation
 
UI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" PatternUI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" Pattern
 
Построение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаПостроение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кода
 

Andere mochten auch

Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)mainstreamless
 
Разработка GUI на GTK (Николай Ходов)
Разработка GUI на GTK (Николай Ходов)Разработка GUI на GTK (Николай Ходов)
Разработка GUI на GTK (Николай Ходов)PingWin Software
 
Хитрости RAII
Хитрости RAIIХитрости RAII
Хитрости RAIIcorehard_by
 
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...Open City Foundation
 
Максим Лапшин, Erlyvideo
Максим Лапшин, ErlyvideoМаксим Лапшин, Erlyvideo
Максим Лапшин, ErlyvideoOntico
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Yauheni Akhotnikau
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?Ivan Tsyganov
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!Ivan Tsyganov
 
Практики жизненного цикла систем машинного обучения
Практики жизненного цикла систем машинного обученияПрактики жизненного цикла систем машинного обучения
Практики жизненного цикла систем машинного обученияCEE-SEC(R)
 
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...Mail.ru Group
 
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&CoMail.ru Group
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Ontico
 

Andere mochten auch (18)

Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)
 
C++ idioms
C++ idiomsC++ idioms
C++ idioms
 
Разработка GUI на GTK (Николай Ходов)
Разработка GUI на GTK (Николай Ходов)Разработка GUI на GTK (Николай Ходов)
Разработка GUI на GTK (Николай Ходов)
 
Для спикера Piter Py #3
Для спикера Piter Py #3Для спикера Piter Py #3
Для спикера Piter Py #3
 
Хитрости RAII
Хитрости RAIIХитрости RAII
Хитрости RAII
 
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
 
Selen framework
Selen frameworkSelen framework
Selen framework
 
Максим Лапшин, Erlyvideo
Максим Лапшин, ErlyvideoМаксим Лапшин, Erlyvideo
Максим Лапшин, Erlyvideo
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!
 
Практики жизненного цикла систем машинного обучения
Практики жизненного цикла систем машинного обученияПрактики жизненного цикла систем машинного обучения
Практики жизненного цикла систем машинного обучения
 
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
 
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)
 

Ähnlich wie VivaMP, система выявления ошибок в коде параллельных программ на языке С++, использующих OpenMP

Тестирование параллельных программ
Тестирование параллельных программТестирование параллельных программ
Тестирование параллельных программTatyanazaxarova
 
VivaMP - инструмент для OpenMP
VivaMP - инструмент для OpenMPVivaMP - инструмент для OpenMP
VivaMP - инструмент для OpenMPTatyanazaxarova
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеTatyanazaxarova
 
Поиск уязвимостей в программах с помощью анализаторов кода
Поиск уязвимостей в программах с помощью анализаторов кодаПоиск уязвимостей в программах с помощью анализаторов кода
Поиск уязвимостей в программах с помощью анализаторов кодаTatyanazaxarova
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex PetrovReal-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex PetrovRuby Meditation
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.Igor Shkulipa
 
Профилирование Go приложений, Стас Макаров, 220 Вольт
Профилирование Go приложений, Стас Макаров, 220 ВольтПрофилирование Go приложений, Стас Макаров, 220 Вольт
Профилирование Go приложений, Стас Макаров, 220 ВольтMail.ru Group
 
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММITMO University
 
использование систем аналитики крэшей
использование систем аналитики крэшейиспользование систем аналитики крэшей
использование систем аналитики крэшейcorehard_by
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.Igor Shkulipa
 
Mobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps DevelopmentMobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps DevelopmentIntersog
 

Ähnlich wie VivaMP, система выявления ошибок в коде параллельных программ на языке С++, использующих OpenMP (20)

Тестирование параллельных программ
Тестирование параллельных программТестирование параллельных программ
Тестирование параллельных программ
 
VivaMP - инструмент для OpenMP
VivaMP - инструмент для OpenMPVivaMP - инструмент для OpenMP
VivaMP - инструмент для OpenMP
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработке
 
Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...
Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...
Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...
 
Поиск уязвимостей в программах с помощью анализаторов кода
Поиск уязвимостей в программах с помощью анализаторов кодаПоиск уязвимостей в программах с помощью анализаторов кода
Поиск уязвимостей в программах с помощью анализаторов кода
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex PetrovReal-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
 
Профилирование Go приложений, Стас Макаров, 220 Вольт
Профилирование Go приложений, Стас Макаров, 220 ВольтПрофилирование Go приложений, Стас Макаров, 220 Вольт
Профилирование Go приложений, Стас Макаров, 220 Вольт
 
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
 
использование систем аналитики крэшей
использование систем аналитики крэшейиспользование систем аналитики крэшей
использование систем аналитики крэшей
 
TAP
TAPTAP
TAP
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
Это сложно
Это сложноЭто сложно
Это сложно
 
Mobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps DevelopmentMobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps Development
 
информатика лекции 4
информатика лекции 4информатика лекции 4
информатика лекции 4
 
лабораторная работа №3
лабораторная работа №3лабораторная работа №3
лабораторная работа №3
 
лабораторная работа №3
лабораторная работа №3лабораторная работа №3
лабораторная работа №3
 
лабораторная работа №3
лабораторная работа №3лабораторная работа №3
лабораторная работа №3
 

Mehr von Tatyanazaxarova

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программTatyanazaxarova
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурTatyanazaxarova
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхTatyanazaxarova
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияTatyanazaxarova
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarova
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarova
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarova
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarova
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеTatyanazaxarova
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияTatyanazaxarova
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииTatyanazaxarova
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 

Mehr von Tatyanazaxarova (20)

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложения
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 

VivaMP, система выявления ошибок в коде параллельных программ на языке С++, использующих OpenMP

  • 1. VivaMP, система выявления ошибок в коде параллельных программ на языке С++, использующих OpenMP Авторы: Алексей Колосов, Андрей Карпов, Евгений Рыжков Дата: 19.04.2009 В настоящее время программные продукты Viva64 и VivaMP включены в состав PVS-Studio и более не распространяются как отдельные приложения. Используйте программу PVS-Studio для получения необходимых возможностей проверки кода. Аннотация В статье приводятся результаты исследований ошибок, которые допускают программисты, использующие С++ и OpenMP. Для автоматического обнаружения этих ошибок предлагается использование статического анализа. Описывается интегрирующийся в среду Visual Studio анализатор VivaMP, реализующий поставленную задачу. 1. Введение По оценкам компании Evans Data, проводящей опросы среди разработчиков ПО, общее количество программистов в мире к 2009 году составит 17 миллионов человек[1]. На сегодняшний день 40% из них используют язык С++, причем около 70% разработчиков занимаются разработкой многопоточных приложений сейчас или планируют начать ее в течение года [2]. По данным того же опроса, 13,2% этих разработчиков считают, что главной проблемой таких разработок является нехватка программных средств для создания, тестирования и отладки параллельных приложений. Следовательно, в решении задачи автоматического поиска ошибок в исходном коде непосредственно заинтересованы примерно 630.000 программистов. Целью работы является создание статического анализатора кода, предназначенного для автоматического обнаружения таких ошибок. В исследовании рассматривался язык C++, поскольку к коду именно на этом языке чаще всего предъявляются требования высокой производительности. Так как поддержка технологии OpenMP встроена в Microsoft Visual Studio 2005 и 2008, и некоторые специалисты считают, что именно технология OpenMP вскоре приобретет наибольшую популярность [3], рассматривалась именно эта технология (помимо C++ применяемая также для языков C и Fortran). Анализ обзоров отладчиков для параллельных программ показывает, что ситуация в этой сфере до сих пор далека от идеала. Применительно к отладке программ, написанных на С++ и использующих OpenMP, как правило, упоминаются TotalView и Intel Thread Checker. Однако, оба эти инструмента предназначены для динамического использования. До недавнего времени направление статического анализа OpenMP программ было практически не освоено. В качестве примера можно привести, пожалуй, только достаточно качественную диагностику, выполняемую компилятором Sun Studio. Статический анализатор VivaMP заполнил это нишу.
  • 2. 2. Применение статического анализа для отладки параллельных программ Большинство существующих на данный момент средств отладки параллельных программ являются динамическими анализаторами, предполагающими непосредственное выполнение анализируемой программы. Такой подход имеет свои преимущества, но у него имеются и недостатки. Динамический анализ предполагает сбор данных только во время выполнения программы, следовательно, нет никакой гарантии, что проверен будет весь код. Более того, данный подход требует от программиста многократного повторения одних и тех же действий, либо применения средств автоматического тестирования для имитации действий пользователя. Помимо этого при динамическом анализе код отлаживаемого приложения подвергается инструментированию, что снижает быстродействие программы, а изредка может даже приводить к сбоям. Поскольку сбор и анализ информации с целью улучшения быстродействия, как правило, откладывается на конец динамического анализа, в случае критической ошибки в анализируемом приложении все результаты анализа оказываются потеряны. Наконец, динамический анализ далеко не всегда позволяет обнаружить конкретный фрагмент кода, который приводит к неожиданному поведению. Статический анализ позволяет просмотреть весь исходный код приложения, не требует от программиста никаких дополнительных усилий и приводит к обнаружению опасных фрагментов кода. Недостаток статического анализа заключается в том, что он не позволяет проверить поведение, зависящее от пользователя. Еще одной проблемой являются ложные срабатывания, уменьшение количества которых требует дополнительных усилий при разработке анализатора. Подробнее вопрос применения статического анализа при разработке параллельных программ рассматривается в статье [4]. В анализаторе VivaMP используется анализ с обходом дерева кода (tree walk analysis). Помимо этого существуют и другие виды статического анализа, предполагающие моделирование выполнения программы, расчет возможных значений переменных и путей выполнения кода. Статический анализ как средство диагностики ошибок в параллельных программах был выбран потому, что данный подход позволяет находить многие ошибки, не диагностируемые динамическими анализаторами. Теперь рассмотрим сами ошибки подробнее. 3. Диагностируемые ошибки Список возможных ошибок, не обнаруживаемых компилятором Visual Studio, был составлен в результате исследования работ, посвященных параллельному программированию с использованием OpenMP, а также на основе личного опыта авторов. Все ошибки можно разделить на четыре основные категории: • недостаточное знание синтаксиса OpenMP; • недостаточное понимание принципов работы OpenMP; • некорректная работа с памятью (незащищенный доступ к общей памяти, отсутствие синхронизации, неправильный режим доступа к переменным, и т. п.); • ошибки производительности;
  • 3. Первые три вида ошибок являются логическими ошибками, которые приводят к изменению логики работы программы, к неожиданным результатам и (в некоторых случаях) к аварийному завершению программы. Последняя категория объединяет ошибки, приводящие к снижению быстродействия. Приведем примеры ошибок каждого вида и их краткое описание. 3.1. Отсутствие ключевого слова parallel Рассмотрим простейшую ошибку, которая может возникнуть при неправильном написании директив OpenMP. Поскольку эти директивы имеют достаточно сложный формат, такую ошибку по тем или иным причинам может допустить любой программист. Пример корректного и некорректного кода приведен на Рис. 1. // Некорректно: #pragma omp for ... // цикл for // Корректно: #pragma omp parallel for ... // цикл for // Корректно: #pragma omp parallel { #pragma omp for ... // цикл for } Рис. 1. Пример ошибки, вызванной отсутствием ключевого слова parallel Приведенный выше фрагмент некорректного кода будет успешно скомпилирован компилятором, даже без предупреждений. Некорректная директива будет проигнорирована, и цикл, следующий за ней, выполнится только одним потоком. Распараллеливания не произойдет, и обнаружить это на практике будет очень трудно. Однако статический анализатор легко укажет на этот потенциально некорректный участок кода. 3.2. Неправильное применение блокировок Если программист использует для синхронизации и/или защиты объекта от одновременной записи функции вида omp_set_lock, каждый поток должен содержать вызовы соответствующих функций omp_unset_lock, причем с теми же переменными. Попытка освобождения блокировки, захваченной другим потоком, или отсутствие вызова разблокирующей функции может привести к
  • 4. ошибкам во время выполнения программы и бесконечному ожиданию. Рассмотрим пример кода (см. Рис. 2): // Некорректно: omp_lock_t myLock; omp_init_lock(&myLock); #pragma omp parallel sections { #pragma omp section { ... omp_set_lock(&myLock); ... } #pragma omp section { ... omp_unset_lock(&myLock); ... } } // Некорректно: omp_lock_t myLock; omp_init_lock(&myLock); #pragma omp parallel sections { #pragma omp section { ... omp_set_lock(&myLock); ...
  • 5. } #pragma omp section { ... omp_set_lock(&myLock); omp_unset_lock(&myLock); ... } } // Корректно: omp_lock_t myLock; omp_init_lock(&myLock); #pragma omp parallel sections { #pragma omp section { ... omp_set_lock(&myLock); ... omp_unset_lock(&myLock); ... } #pragma omp section { ... omp_set_lock(&myLock); ... omp_unset_lock(&myLock); ... }
  • 6. } Рис. 2. Пример некорректного использования блокировок Первый пример некорректного кода приведет к ошибке во время выполнения программы (поток не может освободить переменную, занятую другим потоком). Второй пример иногда будет работать корректно, а иногда будет приводить к зависанию. Зависеть это будет от того, какой поток завершается последним. Если последним будет завершаться поток, в котором выполняется блокировка переменной без ее освобождения, программа будет выдавать ожидаемый результат. Во всех остальных случаях будет возникать бесконечное ожидание освобождения переменной, захваченной потоком, работающим с переменной некорректно. Теперь рассмотрим другую ошибку более подробно и приведем соответствующее правило для анализатора. 3.3. Незащищенный доступ к общей памяти Эта ошибка может встретиться в любой параллельной программе, написанной на любом языке. Также она называется состоянием гонок (race condition) и суть ее заключается в том, что значение общей переменной, изменяемой одновременно из нескольких потоков, в результате может оказаться непредсказуемым. Рассмотрим простой пример для С++ и OpenMP (см. Рис. 3): // Некорректно: int a = 0; #pragma omp parallel { a++; } // Корректно: int a = 0; #pragma omp parallel { #pragma omp atomic a++; } Рис. 3. Пример состояния гонок Эту ошибку также можно обнаружить средствами статического анализатора. Рассмотрим правило, по которому статический анализатор VivaMP сможет обнаружить эту ошибку:
  • 7. Опасными следует считать инициализацию или модификацию объекта (переменной) в параллельном блоке, если объект относительно этого блока является глобальным (общим для потоков). К глобальным объектам относительно параллельного блока относятся: • Статические переменные. • Статические члены класса (В версии VivaMP 1.0 не реализовано). • Переменные, объявленные вне параллельного блока. Объект может быть как переменной простого типа, так и экземпляром класса. К операциям изменения объекта относится: • Передача объекта в функцию по не константной ссылке. • Передача объекта в функцию по не константному указателю (В версии VivaMP 1.0 не реализовано). • Изменение объекта в ходе арифметических операций или операции присваивания. • Вызов у объекта не константного метода. На первый взгляд правило кажется не очень сложным. Но для того, чтобы избежать ложных срабатываний, приходится вводить множество исключений. Проверяемый код следует считать безопасным если: • Код не находится в параллельном блоке (нет директивы "parallel"). • Модификация объекта защищена директивой "atomic". • Код находится в критической секции, заданной директивой "critical". • Код находится в критической секции, образованной функциями вида omp_set_lock. • Код находится в блоке директивы "master". • Код находится в блоке директивы "single". • К объекту (переменной) применена директива "threadprivate", либо выражение "private", "firstprivate", "lastprivate" или "reduction". Это исключение не касается статических (static) переменных и статических полей классов, которые всегда являются общими. • Инициализация или модификация объекта осуществляется внутри оператора for (внутри самого оператора, а не внутри тела цикла). Такие объекты согласно спецификации OpenMP автоматически считаются локальными (private). • Модификация объекта осуществляется внутри секции, заданной директивой section. Пользуясь этим правилом и перечисленными исключениями, анализатор сможет обнаружить ошибку по дереву кода. В заключение этого раздела отметим, что более полный список обнаруженных в результате исследований ошибок и их более подробные описания можно найти в статье [5]. Помимо этого пример программы, демонстрирующей ошибочные и исправленные версии проблемного кода можно найти на сайте проекта VivaMP. Теперь перейдем к описанию самого анализатора.
  • 8. 4. Анализатор VivaM VivaMP Анализатор VivaMP разработан на основе библиотеки анализа кода VivaCore и вместе с анализатором Viva64 составляет единую линейку продуктов в области тестирования ресурсоемких приложений. Viva64 предназначается для поиска ошибок, связанных с переносом 32 iva64 32-битного ПО на 64-битные платформы. VivaMP предназначен для проверки параллельных приложений, битные построенных на базе технологии OpenMP. Как и Viva64, VivaMP интегрируется в среду разработки Visual Studio 2005/2008, добавляя новые команды в интерфейс. Настройка анализатора делается al через стандартный для среды механизм, диагностические сообщения выводятся так же, как сообщения стандартного компилятора - в окна Error List и Output Window. Помимо это этого подробное описание ошибок приведено в справочной системе анализатора, интегрирующейся в справку Visual Studio. Контекстная справка реализована через стандартный механизм среды. Интерфейс анализатора VivaMP, интегрированного в среду Visual Studio приведе на Рис. 4. приведен
  • 9. Рис. 4. Интерфейс VivaMP На данный момент выпущена первая версия анализатора, информацию о которой можно получить по адресу http://www.viva64.com/vivamp-tool. Первая версия VivaMP диагностирует 19 ошибок, однако, количество собранного материала и результаты экспериментов позволяют
  • 10. существенно увеличить это число (как минимум в два раза) в последующих версиях. Ниже перечислены краткие описания диагностируемых ошибок: • Отсутствие ключевого слова "parallel". • Отсутствие ключевого слова "omp". • Отсутствие ключевого слова "for" (каждый поток выполнит цикл полностью, работа не будет разделена между потоками). • Вложенное распараллеливание цикла "for". • Отсутствие директивы "ordered" в упорядоченном цикле. • Переопределение числа потоков в параллельном коде. • Несимметричное использование блокирующих/разблокирующих функций. • Зависимость поведения кода от количества выполняющих его потоков (использование функции "omp_get_num_threads" в арифметической операции). • Переопределение возможности вложенного распараллеливания в параллельном коде. • Одновременное использование общего ресурса (незащищенный вызов функции). • Использование директивы "flush" для указателей. • Использование директивы "threadprivate". Директива опасна, так как влияет на весь файл. Рекомендуется использовать локальные переменные или явно указывать тип доступа в каждом параллельном блоке. • Незащищенное объявление статической переменной в параллельном коде. • Незащищенная одновременная операция с переменной. • Одновременное изменение переменной посредством вызова функции. • Одновременное изменение объекта посредством вызова функции. • Переменная ссылочного типа не должна быть объявлена как локальная. • Указатель не может быть локальной переменной. • Переменная, объявленная как "lastprivate", не изменена в лексически последней параллельной секции. Помимо уже достигнутых результатов, работа по поиску новых ошибок продолжается и сейчас. Если вам, уважаемые коллеги, известны какие-либо паттерны таких ошибок, мы будем благодарны, если вы сообщите нам о них, используя контактную информацию с упомянутого выше сайта проекта VivaMP. Кроме того, нам интересно протестировать наш анализатор на реальных серьезных проектах, применяющих технологию OpenMP. Если вы разрабатываете такой проект и нуждаетесь в анализаторе кода, пожалуйста, свяжитесь с нами. Литература 1. Timothy Prickett Morgan. Evans Data Cases. Programming Language Popularity: [http://www.viva64.com/go.php?url=190], 14.12.2006. 2. Janel Garvin. Evans Data: Market Situation and Predictions: [http://www.viva64.com/go.php?url=191], 8.04.2008 3. Michael Suess. Why OpenMP is the way to go for parallel programming: [http://www.viva64.com/go.php?url=119], 12.08.2006.
  • 11. 4. Е.А. Рыжков, О.С. Середин. Применение технологии статического анализа кода при разработке параллельных программ. Известия ТулГУ. Технические науки. Вып.3. - Тула: Изд-во ТулГУ, 2008. - 267 с. Стр. 191 - 196. 5. Алексей Колосов, Евгений Рыжков, Андрей Карпов. 32 подводных камня OpenMP при программировании на C++. RSDN Magazine #2-2008. Cтр. 3 - 17.