Скачать презентацию Межпроцедурные оптимизации Андрей Неволин Межпроцедурные оптимизации Существует Скачать презентацию Межпроцедурные оптимизации Андрей Неволин Межпроцедурные оптимизации Существует

305a346711badb5e5ece39b084ec667f.ppt

  • Количество слайдов: 19

Межпроцедурные оптимизации Андрей Неволин Межпроцедурные оптимизации Андрей Неволин

Межпроцедурные оптимизации Существует огромное множество межпроцедурных оптимизаций. В данной презентации рассматриваются следующие: • Подстановка Межпроцедурные оптимизации Существует огромное множество межпроцедурных оптимизаций. В данной презентации рассматриваются следующие: • Подстановка процедур (инлайн) • Частичная подстановка процедур • Клонирование процедур • Удаление хвостовой рекурсии • Реорганизация данных программы

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

Подстановка процедур (2 из 3) Эвристики для подстановки процедур могут учитывать: 1. Размер тела Подстановка процедур (2 из 3) Эвристики для подстановки процедур могут учитывать: 1. Размер тела встраиваемой процедуры (чем меньше, тем лучше) 2. Расположенность вызова встраиваемой процедуры внутри цикла 3. Константные параметры вызова процедур 4. Многое другое…

Подстановка процедур (3 из 3) Наибольшая выгода обычно получается при встраивании тел процедур в Подстановка процедур (3 из 3) Наибольшая выгода обычно получается при встраивании тел процедур в циклы (т. к. это позволяет применить больше цикловых оптимизаций) f( … ) { for (… ) { g( … ); } } g(…){ for ( … ) { … } } f( … ) { for ( … ) { … } } }

Частичная подстановка процедур (1 из 2) • Выполняется подстановка только частей процедуры. Для этого Частичная подстановка процедур (1 из 2) • Выполняется подстановка только частей процедуры. Для этого обычно выбираются «горячие» куски процедур (выявленные с помощью профильной информации или на основе статического анализа) • Сохраняется вызов к оставшейся части процедуры

Частичная подстановка процедур (2 из 2) В примере ниже предполагается, что выход из g() Частичная подстановка процедур (2 из 2) В примере ниже предполагается, что выход из g() сразу после проверки условия выполняется гораздо чаще, чем основная часть процедуры. g() { if (…) { return; } // Некоторый большой, // но холодный код … } f() { g(); … } g() { // Некоторый большой, // но холодный код … } f() { if (…) { goto label; else { g(); } label: … }

Клонирование процедур (1 из 3) • Клонирование – создание специализированной копии процедуры. • Клонирование Клонирование процедур (1 из 3) • Клонирование – создание специализированной копии процедуры. • Клонирование применяется, чтобы создать возможность для более полной оптимизации процедуры в частных (но существенных) случаях. • После создания специализированной копии процедуры, к ней [копии] можно применить оптимизации, учитывающие ее специфику.

Клонирование процедур (2 из 3) Клонирование может быть осуществлено на базе результатов, полученных при: Клонирование процедур (2 из 3) Клонирование может быть осуществлено на базе результатов, полученных при: • Распространении констант • Распространении диапазонов • Профилировании значений

Клонирование процедур (3 из 3) В примере ниже клонирование осуществляется на базе информации о Клонирование процедур (3 из 3) В примере ниже клонирование осуществляется на базе информации о константных указателях. qcmp – глобальный указатель на функцию. Здесь клонирование создает дополнительные возможности для инлайна: cmppt() может быть встроена в qst_cmppt(), которая может быть встроена в qsort_cmppt() (аналогично для других клонов). qsort(. . . , cmppt ); qsort(. . . , cmppth ); qsort(. . . , cmpptx ); qsort_cmppt(. . . ); qsort_cmppth(. . . ); qsort_cmpptx(. . . ); static int (*qcmp)(); qsort_cmppt(. . . ) { qst_cmppt(. . . ); } qsort(. . . , int (*compar)()) { qcmp = compar; qst(. . . ); } qst(. . . ) { for (. . . ) { (*qcmp)(. . . ); } } qst_cmppt(. . . ) { for (. . . ) { cmppt(. . . ); } } Остальные клоны аналогичны

Удаление хвостовой рекурсии (1 из 3) Позволяет снизить накладные расходы на вызов процедур, а Удаление хвостовой рекурсии (1 из 3) Позволяет снизить накладные расходы на вызов процедур, а также делает возможным применение цикловых оптимизаций.

Удаление хвостовой рекурсии (2 из 3) Вызов процедуры g() из процедуры f() называется хвостовым, Удаление хвостовой рекурсии (2 из 3) Вызов процедуры g() из процедуры f() называется хвостовым, если сразу после возврата из функции g() выполняется возврат из f(). Если f() в предыдущем определении совпадает с g(), то вызов называется хвостовой рекурсией.

Удаление хвостовой рекурсии (3 из 3) Ниже приведен пример удаления хвостовой рекурсии. Рекурсивный вызов Удаление хвостовой рекурсии (3 из 3) Ниже приведен пример удаления хвостовой рекурсии. Рекурсивный вызов insert_node преобразован в цикл. void insert_node(n, l) int n; struct node *l; { loop: { if (n > l value) if (l next == NULL) … ; else insert_node(n, l next); else } { l = l next; goto loop; } }

Реорганизация данных Богатое разнообразие оптимизаций. Среди основных можно выделить: • Переупорядочивание полей структур • Реорганизация данных Богатое разнообразие оптимизаций. Среди основных можно выделить: • Переупорядочивание полей структур • Разбиение структур • ILP 32

Реорганизация данных (переупорядочивание полей структур) • Поля, доступ к которым осуществляется в близкие промежутки Реорганизация данных (переупорядочивание полей структур) • Поля, доступ к которым осуществляется в близкие промежутки времени, укладываются рядом друг с другом • В результате, появляется возможность «подкачать» в хэш максимум полезной информации

Реорганизация данных (разбиение структур) (1 из 2) Имеет смысл в случае массива структур. Общая Реорганизация данных (разбиение структур) (1 из 2) Имеет смысл в случае массива структур. Общая идея: • Разбить структуру на «горячую» и «холодную» структуры • Разместить «горячие структуры» вместе Используется совместно с переупорядочиванием полей

Реорганизация данных (разбиение структур) (2 из 2) Переупорядочивание полей Одна структура «Горячие» поля Холодные Реорганизация данных (разбиение структур) (2 из 2) Переупорядочивание полей Одна структура «Горячие» поля Холодные поля Разбиение структур Указатели на «холодные структуры»

Реорганизация данных (ILP 32) • Используется для оптимизации программ на 64 -разрядных машинах • Реорганизация данных (ILP 32) • Используется для оптимизации программ на 64 -разрядных машинах • Указатели и длинные целые преобразуются из 64 -битных значений в 32 -битные • Пользователь сам должен указать, что его программа может работать в 32 -битном адресном пространстве • Имеет смысл в случае массивов указателей или длинных целых (программа использует меньше памяти; в хэш попадает в 2 раза больше полезной информации)

Конец (счастливый) Конец (счастливый)