| 20.09.2010 06:00 | |
Информация об авторе.
Бригинец Василий Петрович, студент 5 курса Института Космических и Информационных Технологий Сибирского Федерального Университета. Обучение ведется по специальности 230102.65 - Автоматизированные системы обработки информации и управления на кафедре Системы Искусственного Интеллекта.
В рамках летней школы 2010 года проходил стажировку вместе с Кудинкиным Алексеем в Новосибирском офисе Интел под руководством Ильи Черного, Александра Фенстера и Василия Куркова. Менеджером выступил Виталий Саяпин.
Во время летней школы победил в конкурсе «Летняя Атомосфера». В данный момент зарегистрирован на участие в XI Открытой Всесибирской олимпиаде по программированию им. И. В. Поттосина.
В свободное время веду разработки приложений для мобильных телефонов на базе операционной системы WIndowsCE и готовлюсь к поступлению в аспирантуру.
Аннотация
В статье рассматривается возможность установления зависимости между тестами, ежедневно тестирующими программный продукт Intel® Compiler, покрытием исходного кода компилятора и плотностью найденных ими ошибок.
Было проведено исследование эффективности тестирований на различных платформах, разработана композитная система статистического анализа данных о тестировании компилятора и последующего исследования покрытия кодов компилятора и написано несколько Perl-скриптов, облегчающих работу с историческими данными.
Введение
Тестовая база программного продукта Intel® Compiler содержит десятки тысяч тестов, которые 24 часа в сутки 7 дней в неделю исполняются для проверки качества текущей версии компилятора. Поддержание такой тестовой системы требует огромного количества оборудования и работы большой команды специалистов по качеству компилятора. Оптимизация тестового набора может существенно сократить необходимые ресурсы и улучшить качество тестирования компилятора.
Многие тесты, наборы опций компиляции тестов и платформы запуска тестов дублируют друг друга, в результате чего при возникновении ошибок перестают проходить сразу несколько тестов, направленных на обнаружение одинаковых ошибок. Таким образом, для обнаружения большей части ошибок достаточно запускать на тестирование только некоторое подмножество тестов.
Планировалось проанализировать данные тестирования компилятора за последние несколько лет. На основе выполненного анализа выявить зависимости между тестами, обнаруживающими одни и те же ошибки и проверяющими одни и те же строки исходных кодов компилятора. После этого предложить минимальные наборы тестов, достаточные для тестирования компилятора с определенными вероятностями обнаружения ошибок. Кроме того, необходимо было выделить участки исходного кода компилятора, имеющие недостаточное покрытие тестами и высокую плотность появления ошибок.
Полученные данные могут использоваться для формирования наборов регулярного тестирования компилятора и создания запросов на расширение тестовой базы компилятора.
Выбор используемых технологий и инструментов входил в состав задач.
Основная часть
Для анализа данных была спроектирована и реализована система обработки и визуализации данных о связи между ошибками и тестами, между ошибками и исходными кодами компилятора, тестами и исходными кодами компилятора, тестов друг с другом.
В качестве косвенной метрики для оценки эффективности отдельно взятого тестирования было выбрано общее количество, а также количество уникальных для каждого тестирования трекеров (tracks - идентификатор найденной ошибки).
Решение поставленных задач осуществлялось с использованием интерпретируемого языка Perl, как удобного средства работы с регулярными выражениями и большими объёмами текстовой информации.
Общую схему решения задач можно представить в следующем виде:
Рисунок 1 - Схема решения задач
На первом этапе(I) осуществляется синтаксический анализ текстовых файлов, содержащих информацию о падениях тестов в течение тестового прогона некоторой сборки компилятора.
Рисунок 2 - Структура базы исторических данных
На втором (II) этапе осуществляется процесс анализа обработанных на первом этапе исторических данных. Здесь происходит поиск тестов, которые ни разу не падали, выявление зависимостей между падавшими хоть раз тестами и многое другое.
На третьем (III) этапе производится вывод полученной информации в удобном для дальнейшего анализа виде:
1) В текстовом виде:
2) В табличном виде:
3) В виде графиков и диаграмм:
Итак, была разработана композитная система статистического анализа исторических данных о тестировании компилятора. Система с помощью нетривиальной эвристики выявляет коррелированность тестовых падений.
Рисунок 3 - Три разных теста, падающих одновременно
Далее, попарно сравнивается покрытие кодов компилятора отобранными "сильно коррелированными" парами тестов.
Рисунок 4 - Сравнение покрытия кода
Если большая часть покрываемых каждым из тестов строк кода компилятора совпадают, очевидно, что один из тестов в какой-то мере избыточен.
Для более удобного определения покрытия тестами исходных кодов компилятора был написан специальный Perl-скрипт. В результате работы такого Perl-скрипта получаются файлы, в которых указывается тесты, которые попадали на ту или иную строку исходного кода компилятора. Их количество и название соответствует файлам исходных кодов компилятора.
Рисунок 5 - Пример файла с указанием попавших тестов в ту или иную строку кода компилятора
Такая информация позволяет легко анализировать покрытие тестами исходных кодов компилятора. И теперь можно, написав определенный Perl-скрипт, получить любую интересующую информацию, будь то пересечение покрытий двух тестов или определение, в каком модуле наибольшее количество находимых ошибок и т.п.
Для примера был написан Perl-скрипт, который выдает процентное соотношение пересечений между тестами.
Рисунок 6 - Пример вывода Perl-скрипта
С помощью этой информации можно определить, какие тесты покрывают одни и те же строки исходного кода компилятора.
Рисунок 7 - Пересечение покрытия тестами исходных кодов компилятора
В конце летней практики были подготовлены рекомендации о том какие тесты следует перенести из ежедневного тестирования в еженедельные, какие следует перенести в промоушн (promotion) тестирование (тестирование, осуществляемое разработчиками компилятора). В этом помог написанный Perl-скрипт, с помощью которого были вычислены тесты, составляющие основу. При использовании только этих тестов могли быть найдены все ошибки за все время тестирований (но это не значит, что только они будут находить все ошибки в будущем). Такие тесты были рекомендованы для использования на всех тестирования (ежедневных, промоушн и т.п.) и на всех платформах (windows, linux, mac).
Рисунок 8 - Пример выделения основных тестов
Также для команды специалистов по качеству компилятора было полезным увидеть статистику по падениям, которая позволяет понять, какие тесты наиболее полезны, на какой платформе лучше работает тест и тому подобное.
Рисунок 9 - Пример статистических данных
Выполняющий это Perl-скрипт универсален. При запуске необходимо только указать директорию с необходимыми для анализа файлами и будет сгенерирована такого рода статистика в удобном excel-формате.
Заключение
Необходимость выполнения поставленных целей очевидна - из-за постоянно возрастающего количества тестов требующих все больших вычислительных и человеческих ресурсов, из-за необходимости улучшения качества компилятора, посредством обнаружения ошибок и своевременного реагирования на них, да даже из-за облегчения визуального восприятия исторической информации по падениям для сотрудников Intel.
Во время стажировки был осуществлен небольшой поиск аналогичных задач, и, как выяснилось, отдаленно похожие работы существуют, но использовать их в нашем случае было невозможно. Поэтому выполненной работе аналогов пока нет.
Все поставленные задачи были выполнены к концу летней стажировки. Несмотря на специфику задач и уникальность исторических данных, написанные Perl-скрипты могут пригодиться и в других работах. К примеру, можно использовать код, работающий с excel документами в любых других Perl-скриптах. Но самое главное - было получено одобрение и признание необходимости проделанной работы коллегами по команде Intel/SSG/ICL/QA.
Список использованных материалов/литературы
Для решения задач, как уже было сказано выше, использовался интерпретируемый язык Perl. Интерпретатором этого языка был выбран ActivePerl. Также в работе использовалась утилита codecov, входящая в состав компилятора Интел.
При обучении программированию на perl очень помог ментор Александр Фенстер и книга «Perl: Библиотека программиста» Т.Кристиансена.
Также была использована книга «Методы Анализа Данных» Рубана А.И. и методическое пособие для студентов «Теория принятия решений» Лапко А.В..
Пожалуйста, обратитесь к странице Уведомление об оптимизации для более подробной информации относительно производительности и оптимизации в программных продуктах компании Intel.
Комментарии (9) 
| 06.10.2010 10:37
Василий
| Обязательно:) Уже пишу, просто решил это сделать не в статье (все таки это статья, какие тут могут быть впечатления?), а в блоге. Уже на самом деле в процессе. Так что в скором времени должна появится:) |
| 06.10.2010 21:03
julia motovilova
|
СТАТЬЯ получилась красочная, но можно было бы ее еще приукрасить интересными историями и впечатлениями от пройденной стажировки. Летняя стажировка помогла тебе в достижении каких нибудь целей? |
| 06.10.2010 22:40
Василий
|
Как я уже сказал в комментарии выше, все свои впечатления я решил написать в блоге. Все такие это статья техническая. Так что и на этот вопрос я отвечу там:) |
| 06.10.2010 23:59
julia motovilova
| очень забавно выглядят кстати твои комментарии у каждого участника этого конкурса,как будто ненароком снижаешь их значимость =) |
| 07.10.2010 00:55
Василий
|
Не совсем понял твоего намека. Я коментировал только те статьи, которые я прочитал, и спрашивал то, что мне действительно интересно, либо делал замечания. Как таким образом можно понизить значимость? P.S. Можешь посмотреть все мои сообщения - они не только к статьям участников этого конкурса. |
| 14.10.2010 07:00
julia.shatilina
| Хорошая статья, Вась :) Жаль, что твои напарник по стажировке не написал статью о своей части работы, мне кажется ему тоже было что сказать. |
| 17.10.2010 04:53
Vitaly Slobodskoy (Intel)
|
Отличная статья! На мой взгляд подобная тематика изначально проигрышнее "методов управления жестами" или "высокопроизводительного инструкционного кэша", однако в данной статье, на мой взгляд, автор прекрасно показал каких результатов можно добиться и выжать из столь, казалось бы, "бедной" тематики! Однозначно 5 звёзд. Остался только один вопрос: а почему именно perl, а не, сильно набирающий сейчас обороты, python? Вы его просто хорошо знаете или в вашу задачу входило обязательное требование использовать perl? |
| 17.10.2010 05:32
Василий
|
Спасибо за теплые слова, приятно слышать! Несмотря на скучное название, на самом деле было очень интересно работать над задачей. Я работал с исходниками компилятора и то, что мы сделали с напарником хоть и не принесет видимой пользы обществу, но очень поможет команде, следящей за качеством компилятора. Основной же причиной выбора Perl было то, что его используют в моей команде и можно сказать, что это было неким требованием к задаче. Очевидно, для них было бы удобней в будущем работать с Perl-скриптами. Кстати, с перлом я не был знаком и, благодаря моему ментору Александру, изучил его в кратчайшие сроки. |
Обратная ссылка (1)
-
Twitter Trackbacks for
Анализ зависимостей между тестами, покрытием кода и плотностью ошибок - Intel® Software Network
[intel.com]
on Topsy.com
07.10.2010 07:04



danil_skachkov
293