ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

       

ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ ТОМ

Аннотация
Об авторе
О серии книг "Оптимизация"
Том I Оперативная память
Том II Процессор
Том III Автоматическая кодогенерация
Том IV Ввод/вывод
Том V Параллельные вычисления и суперкомпьютеры
Краткая история создания данной книги


Соглашения об условных обозначениях и наименованиях

Pro et contra целесообразности оптимизации
О чем и для кого предназначена эта книга
Как учатся оптимизации
Семь китов оптимизации или Жизненный цикл оптимизации
Правило I
Правило II
Правило III

Правило IV
Правило V
Правило VI
Правило VII
Вредный совет 1 Используйте табличные вычисления вместо расчетов
Распространенные заблуждения
Заблуждение I За меня все оптимизирует мой компилятор!
ЗаблуждениеII Максимальная эффективность
ЗаблуждениеIII Человек, в отличии
ЗаблуждениеIV Процессоры семейства

Часть 0 Профилировка программ
Цели и задачи профилировки
Общее время исполнения
Удельное время выполнения
Информация о пенальти

Определение количества вызовов
Определение степени покрытия
Фундаментальные проблемы профилировки "в малом"
Конвейеризация или пропускная способность vs латентность
Неточность измерений

* В поисках нуля *
Аппаратная оптимизация
Низкая "разрешающая способность"
Фундаментальные проблемы профилировки "в большом"
Непостоянства времени выполнения
Программное непостоянство
Аппаратное непостоянство

Обработка результатов измерений
Проблема второго прохода
Проблема наведенные эффектов
Краткий обзор современных профилировщиков
Intel VTune
AMD Code Analyst

Microsoft Profile.exe
Сравнительная характеристика профилировщиков
Пишем собственный профилировщик
Краткое описание профилировщика DoCPUClock
Несколько советов по измерению производительности
Практический сеанс профилировки с VTune в десяти шагах

Шаг первый. Удаление printf
Шаг второй. Вынос strlen за тело цикла
Шаг третий. Выравнивание данных

Шаг четвертый. Избавление от strlen
Шаг пятый. Удаление операции деления
Шаг шестой. Удаление мониторинга производительности
Шаг седьмой. Объединение функций
Шаг восьмой. Сокращения операций обращение к памяти
Шаг девятый. VTune – ваш персональный тренер

Шаг десятый. Заключительный

Итоги и прогнозы
A VOL D'OISEAU
Часть IV Приложение I Программистская копилка
Как сделать свои программы надежнее?
Причины и последствия ошибок переполнения

Переход на другой язык
Использование кучи для создания массивов
Отказ от индикатора завершения
Обработка структурных исключений
Традиции vs надежность
Как с ними борются?
Поиск уязвимых программ
br> Вместо заключения
Архиерей – царство MS-DOS
Сжатие файлов под Windows 9x\NT
Измерения падения производительности от сжатия программ (DLL)
Выводы:
Самомодифицирующийся код в современных операционных системах

Архитектура памяти Windows
Использование WriteProcessMemory
Выполнение кода в стеке
"Подводные камни" перемещаемого кода
Елей и деготь оптимизирующих компиляторов
Елей и деготь оптимизирующих компиляторов - 2
Самомодифицирующийся код как средство защиты приложений

Пара слов в заключении
Об одном подходе к решению задач…
Секреты Visual Studio
Закладки

ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

Препроцессор
Поиск

Удаление текста
Операции со строками и словами
Перемещение по тексту
Операции с сентенциями
Выделение
Повтор действий
Полезные макросы
Заключение
Разгон… Sound Blaster'а

Функции с аргументами по умолчанию – из Си++ в классический Си
Силки для клиента или 7 таинств мистерий
Идеология – как средство конкурентной борьбы
Как заставить клиента купить лицензионную копию ПО?

Как заставить клиента купить новую версию ПО?
Как удержать клиента в своих руках?
Как привлечь к себе внимание?
Как создать иллюзию устойчивости, когда делать идут хуже некуда?
Как опубликовать рекламную статью бесплатно?
В ожидании конца света

Игры не для всех
Придя в этот мир - оглянись!
Техника оптимизации программ Подсистема оперативной памяти ЭНЦИКЛОПЕДИЯ

Введение
Иерархия оперативной памяти
Часть I Оперативная память

В ядре
Conventional DRAM (Page Mode DRAM) – "обычная" DRAM
Эволюция динамической памяти.
FPM DRAM (Fast Page Mode DRAM) быстрая страничная память
Формула памяти
EDO-DRAM (Extended Data Out) память с усовершенствованным выходом

BEDO (Burst EDO) – пакетная EDO RAM
SDRAM (Synchronous DRAM) – синхронная DRAM
DDR SDRAM, SDRAM II (Double Data Rate SDRAM) SDRAM с удвоенной скоростью передачи данных
RDRAM (Rambus DRAM) - Rambus-память
Сравнительная характеристика основных типов памяти
Взаимодействие памяти и процессора

Вычисление полного времени доступа
Отображение физических DRAM-адресов на логические

Оптимизация работы с памятью
Brief
Разворачивание циклов
Устранение зависимостей по данным

Параллельная обработка данных
Оптимизация ссылочных структур данных
Уменьшение размера структур данных

Стратегия распределения данных по DRAM-банкам
Планирование потоков данных
Обработка памяти байтами, двойными и четвертными словами
Выравнивание данных
Комбинирование вычислений с доступом к памяти
Группировка операций чтения с операциями записи

Фоновое копирование памяти
Обращайтесь к памяти только когда это действительно необходимо
Проблемы оптимизации программ на отдельно взятой машине
Оптимизация штатных Си-функций для работы с памятью

ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

Сводная характеристика качества оптимизации штатных Си функций и функций ОС для работы с памятью
Оптимизация строковых штатных Си-функций

Оптимизация блочных алгоритмов
Оптимизация сортировки больших массивов данных

Проблемы тестирования оперативной памяти
Часть II Подсистема кэш-памяти
Принципы функционирования SRAM
История
Устройство триггера
Устройство элемента "НЕ" (инвертора)
Устройство матрицы статической памяти

Устройство интерфейсной обвязки
Временные диаграммы чтения/записи
Типы статической памяти
Асинхронная статическая память
Синхронная статическая память
Конвейерная статическая память
Кэш – принципы функционирования
Истоки
Цели и задачи кэш-памяти

Организация кэша
Блокируемая и не блокируемая кэш память
Понятие ассоциативности кэша
Политики записи и продержка когерентности

Протокол MESI
Двухуровневая организация кэша
Раздельное хранение кода и данных
Буфера записи

Кэш-подсистема современных процессоров
Архитектура и характеристики кэшей современных микропроцессоров
Влияние размера обрабатываемых данных на производительность

В кэше первого уровня
Выход из кэша первого уровня
В кэше второго уровня
Выход из кэша второго уровня (мнимый)
Выход из кэша второго уровня (настоящий)

Особенности кэш-подсистемы процессора AMD Athlon
Особенности кэш-подсистемы процессоров P-II и P-III
Влияние размера исполняемого кода на производительность
Выход за пределы кэша первого уровня
Выход за пределы кэша второго уровня

Обработка "расщепленных" (line-splint) данных
Естественное (natural) выравнивание данных
Как компиляторы выравнивают данные
Стратегия оптимального выравнивания

Стратегия распределения данных по кэш-банкам
Выравнивание команд
Комбинирование операций чтения с операциями записи

Учет ограниченной ассоциативности кэша
Особенности обработки двумерных массивов
Использование преимуществ синхронного чтения

Упорядочивание обращения к памяти
Волчьи ямы опережающей записи
Волчьи ямы опережающей записи II
Комбинирование операция записи с вычислительными операциями
Управление кэшированием в x86 процессорах старших поколений
Программная предвыборка в процессорах K6+ и P-III+

ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

Предвыборка в процессорах AMD K6\Athlon и VIA C3
Предвыборка в процессорах P-III и P-4

Сводная характеристика инструкций предвыборки различных процессоров
Аппаратная предвыборка в микропроцессоре P-4
Эффективность предвыборки в многозадачных системах
Практическое использование предвыборки
Определение предпочтительной кэш-иерархии

Планирование дистанции предвыборки
Увеличение эффективности предвыборки.
Оптимизация структур данных под аппаратную предвыборку
Секреты копирования памяти или
Оптимизация копирования памяти
Оптимизация заполнения (инициализации) памяти
FECI QUOD POTUI, FACIANT MELIORA POTENTES
Часть III Машинная оптимизация
Сравнительный анализ оптимизирующих компиляторов языка Си\Си++

Сводная таблица
Оптимизация константных выражений
Замена переменных константными значениями ("размножение" констант)
Вычисление значения переменных на стадии компиляции ("свертка" констант)
Вычисление значений функций на стадии компиляции ("свертка" функций)
Удаление неиспользуемых переменных
Удаление копий переменных
Удаление неиспользуемых присвоений
Удаление лишних присвоений
Удаление лишних выражений[2]

Удаление лишних вызовов функций
Выполнение алгебраических упрощений
Оптимизация подвыражений
Сложение и вычитание
Деление
Взятие остатка
Умножение
Замена условных переходов арифметическими операциями
Удаление лишних условий
Удаление заведомо ложных условий

Балансировка логического древа
Создание таблицы переходов
Слияние циклов
Вынесение инвариантного кода за пределы цикла
Замена циклов с предусловием на циклы с постусловием
Замена инкремента цикла на декремент
Удаление ветвлений
Оптимизация передачи аргументов

Оптимизация пролога/эпилога функций
Оптимизация распределения переменных
Оптимизация инициализации строк
Оптимизация "мертвого" кода
Оптимизация константных условий
Смертельная схватка: Ассемблер vs. Компилятор
Краткий экскурс с историю или ассемблер – это всегда весна
Критерии оценки качества машинной оптимизации
Методики оценки качества машинной оптимизации

Сравнительный анализ основных компиляторов
Обсуждение результатов тестирования
Наглядная демонстрация качества машинной оптимизации

Определение ситуаций предпочтительного использования ассемблера
Особое замечание о создании защитного кода на ассемблере
Программирование на ассемблере как особый род творчества
Исходные тексты

Содержание раздела