Владиславлев Виктор Системы программирования (СП) Создание СП для новых архитектур.

Презентация:



Advertisements
Похожие презентации
Владиславлев Виктор Системы программирования (СП) Создание СП для новых архитектур.
Advertisements

ПРЕЗЕНТАЦИЯ НА ТЕМУ: ПРЕЗЕНТАЦИЯ НА ТЕМУ: ВИДЫ ТРАНСЛЯЦИИ Составил: Ревнивцев М.В Преподаватель: Кленина В.И.
Вперёд ЯЗЫКИ ПРОГРАММИРОВАНИЯ ЦЕЛИ: ЦЕЛИ: 1. Средство для задания действий, которые должны быть выполнены машиной.(Машинный язык) 1. Средство для задания.
Объектно-ориентированное программирование Карпов В.Э. Смолток. Лекция 4. Байт-код.
Внутреннее представление компилятора Типы представлений и их особенности.
Теория языков программирования и методы трансляции Тема 8 Генерация кода.
Разработка программного обеспечения для сигнальных процессоров TMS320C64xx в IDE Code Composer Studio Часть I. Основные возможности среды разработки CCS.
RISC-архитектуры ( Reduced Instruction Set Computer)
Help: настройка Visual Studio.Net для создания консоль-приложения на основе Intel C++ с применением OpenMP. Инструменты «Практическое параллельное программирование.
Тема 2. Способы адресации и система команд МП. Непосредственная адресация Суть способа. Требуемые данные (#data ̶ непосредственный операнд, константа)
Разработка параллельных приложений для многоядерных систем С.В. Ковальчук НИИ Наукоемких компьютерных технологий, СПбГУ ИТМО.
Архитектура операционной системы. Ядро и вспомогательные модули операционной системы При функциональной декомпозиции ОС модули разделяются на две группы:
OpenMP. Различие между тредами и процессами ПроцессыТреды.
Использование технологии компиляции на этапе исполнения (JIT) для моделирования работы микропроцессоров. Студент 6го курса Ситало Алексей Юрьевич Научный.
АРХИТЕКТУРА СОВРЕМЕННЫХ ЭВМ Лекция 6: Уровень архитектуры набора команд ВМиК МГУ им. М.В. Ломоносова, Кафедра АСВК Чл.-корр., профессор, д.ф.-м.н. Королёв.
М.Ю. Харламов, ВНУ им. В.Даля, Генерация объектного кода это перевод компилятором внутреннего представ­ления исходной программы в цепочку символов.
Системы с несколькими конвейерами В процессорах Intel конвейер появился только начиная с 486 модели. Но уже в Pentium-е было два конвейера из 5 стадий:
М.Ю. Харламов, ВНУ им. В.Даля, Семантический анализатор Семантический анализатор выполняет следующие основные действия: проверку соблюдения во входной.
Архитектура операционных систем. Архитектура ОС Состав модулей (компонент) ОС Структура связей между отдельными модулями ОС Принципы взаимодействия модулей.
Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ.
Транксрипт:

Владиславлев Виктор Системы программирования (СП) Создание СП для новых архитектур

Создание/Портирование СП Два пути Создание Toolchain с нуля: есть свои плюсы, но о них почти ничего не известно (пропреитарный код, который можно продавать) Портирование имеющегося – Коммерческие Front-Endы – Edison Design Group – Открытая система программирования GCC (GNU Compiler Collection) – Еще одна: LLVM (Low-Level Virtual Machine) – UTL (Universal Translating Library) Creating/Poring TC … … … Входные языки Целевые платформы SUN Compiler MS Compiler GCC LLVM EDG Front-End Intel compiler Elbrus compiler CG 1 CG 2 C++CF77

Простой пример на С и его возможное расположение в памяти Семантические единицы: тип и размер данных, управляющие структуры, операции, вызовы функций (что требует ABI) Это трудоемко! Описание машины быстро решает эту задачу Простой пример Example

Показан процесс сборки cc1 под ARM Сверху – блок исходных кодов, снизу – компоненты компилятора Из MD генерируется RTL generator (expander) и кодогенератор MD – описывает структуру генератора генератора кода Описание Машины Machine Description (MD)

Циклограмма работы собранного компилятора SSA (static single assignment) – представления кода, при котором каждая переменная непосредственно модифицируется лишь единожды, а далее только используется GIMPLE – высокоуровневый язык внутреннего для GCC представления программы в SSA форме RTL (register transfer language) – низкоуровневый язык внутреннего для GCC представления программы, по сути высокоуровневый ассемблер Цикл работы компилятора ???(MD)

Файловая структура: директория gcc/gcc/config/ Файлы.h,.cpp и.md, который содержит: define_insn – шаблон инструкции в генерации кода define_split – шаблон разбиения сложных шаблонов на более простые define_expand – именнованный шаблон, используется для генерации RTL из GIMPLE define_peephole – шаблон частной архитектурно-зависимой оптимизации define_predicate – шаблон предиката (для проверки соответствия операндов инструкции) Структура описания в GCC GCC description structure

LLVM IR – high level IR Раскрытие llvm ir в инструкции целевой архитектуры два этапа: 1.DAG -> ISelDAG – граф, спечифичный для целевой архитектуры 2.выбор инструкции Каждая инструкция ахритектуры описывается инструкциями llvm ir Пример MLA : – это для хороших инструкций. Для плохих (некорые llvm ir могут не иметь прямого аналога): 1.promote type: i1(bool); пример – bool раскрывается в char или int32 2.expand: llvm пытается сделать преобразование; пример – var_arg это node в llvm ir; если указать expand, то будет грузить var_arg из памяти с соответсующими размерами 3.custom: пользователь сам определят во что раскрывать llvm_ir node; пример – var_arg нестандартных типов (структур) Портирование в LLVM LLVM porting def MLA insnSP , mla $dst, $src1, $src2, $src3, [(set $dst, (add (mul $src1, $src2), $src3))]>

ABI (Application Binary Interface) – набор соглашений для обеспечения взаимодействия между приложениями, библиотеками и ОС Размер и выравнивание данных Формат системных вызовов Calling Convention – cпособ передачи параметров функций и возвращаемого значения: – Где передавать параметры: на регистрах, в стеке, через динамическую память, комбинируя всё вышеперечисленное – В каком порядке: прямом, обратном (проще реализовать эллипсиса) – Кто сдвигает стек обратно: callee или caller – Callee/Сaller saved регистры Какие бывают: cdecl – через стек, справа налево, обратный сдвиг – caller pascal – через стек, слева направо, сдвиг – callee fastcall – на регистрах, сдвиг – callee stdcall – через стек, справа налево, сдвиг – callee tailcall – вызов непосредственно перед возвратом, можно не двигать стек Двоичный интерфейс приложения ABI caller f() callee g()

Требования к библиотекам (в порядке убывания значимости) 1.Соответствие стандарту (корректная работа) 2.Код максимально написана на ЯВУ с минимальными аппаратными зависимостями 3.Эффективность (Premature optimazation is the root of all evil) В идеале необходимо создать лишь машинно-зависимую часть Рассмотрим bionic. Девиз: keep it really simple! Содержит libc, libm и немного для C++ НЕ содержит поддержки механизма исключений и wide chars собирается общей системой сборки Android содержит таблицу с номерами системных вызовов и их параметрами tools/gensyscalls.py – скрипт для генерации системных вызовов В аппаратно-зависимой части находятся setjmp() / longjmp() Содержит динамический загрузчик ld.so Портирование Библиотек Library Porting

Создание/портирование компилятора и ОС происходит параллельно с созданием архитектуры. Вопрос: КАК? Ответ: симулятор Функциональный симулятор Задача – отрабатывать семантику эмулируемого кода как можно быстрее QEMU – быстрый и портируемый динамический транслятор; имеет свой IR Эмулирует x86, PowerPC, ARM, MIPS, SPARC,... и устройства ввода/вывода Performance симулятор Задача – воссоздать потактовую модель архитектуры предельно точно Конвейер Кэш Память – О-о-очень медленный Симулятор Simulator

SimPoint – обрабатывает трассы симулятора в формате Basic Block Vectors (BBV) и определяет наиболее интересные интервалы исполнения для прогона на Performance симуляторе. Близкие интервалы относят к одной фазе. SimPoint

Средства отладки До отладчика Static source analysis – анализ исходного кода до или во время компиляции (компилятор, утилиты lint, cppcheck) Dynamic source analysis – анализ программы на этапе исполнения; исходный код инструментируется до/во время компиляции (Insure++) Static binary analysis – анализ двоичных файлов до их запуска (Антивирусы) Dynamic binary analysis – анализ кода на этапе исполнения; инструментируется бинарный код (valgrind, Pin) Комбинированные решения Отладчик На основе аппаратной поддержки – debug registers На основе программной поддержки: INT 1 – пошаговое исполнение; INT 3 – однобайтовая команда (INT n – 2 байта) GDB (GNU DeBugger) – поддерживает оба механизма, для привязки к коду требуется отладочная информация, что требует поддержки компилятора. Есть gdb-server – для упрощения портирования. Debugging tools

Valgrind Общий механизм для запуска различных утилит анализа Замедляет работы приложения в раз По сути является JIT (Just-In-Time) компилятором (UCode – Собственный IR) Имеет ряд стандартных утилит Альтернатива – утилита Pin от Intel, настроена на x86, IA64, XScale >100 утилит для Pin. На горячем коде замедление раза, на холодном раз framework Valgrind X86 PPC … Build IL IL Code gen init IL Instrumented IL Tool Memcheck – проверка памяти Cachegrind – профиль кэша Callgrind – профиль кэша+кода Massif – профиль кучи Helgrind – анализ многопоточности Lackey – кол-во инструкций и BB TreadSanitizer – новое от Google

VTune – система от Intel, сбор информации о динамическом поведении приложения на основе аппаратной поддержки (множество системных регистров) Gprof – в основе лежит метод Монте-Карло: каждые 10мс прерывается исполнение, смотрим стек и добавляет 10мс ко времени исполнения процедуры Gcov – воснове лежит инструментирование кода счетчиками, которые сохраняются в файле после исполнения. Эта же технология используется для profile-guided оптимизаций Утилиты на основе valgrind (+ callgrind или cachegrind) – в основе лежит детальный подсчет инструкций, не инструментирует код, но динамически ретранслирует приложение ++ Для профилирования надо инструметрировать код ++ в GCC опция -pg для gprof и --coverage для gcov Анализ производительности Performance Analysis

index % time self children called name /48965 BZ2_bzWriteClose64 [29] /48965 BZ2_bzWrite [7] [5] BZ2_bzCompress [5] /48965 handle_compress [6] /56 isempty_RL [43] /48965 BZ2_bzCompress [5] [6] handle_compress [6] /273 BZ2_compressBlock [8] / add_pair_to_block [22] /273 prepare_new_block [42] /56 isempty_RL [43] /6 init_RL [47] /273 BZ2_blockSort [9] [10] mainSort [10] / mainGtU [15] Пример профиля Gprof Profile example Место в профиле Собств. время Время потомков Общее число вызовов Откуда вызвали Сколько вызвали отсюда Листовая функция, вызывается из одного места в огромном цикле

Число вызовов процедуры Пример профиля Gcov 2: 681:double kernel( ) { -: 682: long k, lw, j, tst_num; -: 683: double temp; 2: 684: double my_sum = 0; -: 685: 2: 686: my_sum = 0; 2: 687: m = ( 1001 * ) / 2; 8: 688: for( tst_num = 1; tst_num

Граф вызовов Call Graph

Профиль по инструкциям Instruction profiling

Исполняемые форматы ELF – Executable and Linkable Format (Unix, Linux) PE – Portable Executable (Windows) a.out – условно непосредственный код COFF (XCOFF, ECOFF) Executable Formats

Stab COFF PE/COFF OMF IEEE-695 DWARF – рекомендован к ознакомлению Отладочные форматы Debugging formats