Download presentation
Presentation is loading. Please wait.
2
Нижегородский Государственный Университет Им. Н.И. Лобачевского Факультет Вычислительной Математики И Кибернетики Учебно-исследовательская Лаборатория "Информационные Технологии" Техника оптимизации программ Разработчики: Зебрин Д.А. Бадер А.А. 2003 Куратор: Мееров И.Б.
3
ННГУIT Lab 2 Содержание 1.Введение.Введение. 2.Оптимизация использования оперативной памяти.Оптимизация использования оперативной памяти. 3.Оптимизация использования КЭШа.Оптимизация использования КЭШа.
4
ННГУIT Lab 3 А ВАМ ЭТО НАДО? Если вы собрались оптимизировать программу, подумайте...
5
ННГУIT Lab 4 1.1 Виды оптимизации Оптимизация по времени. Оптимизация по требуемой памяти. Современные компьютеры так мощны, что даже WINDOWS XP оказывается бессильна их затормозить! Крис Касперски
6
ННГУIT Lab 5 1.2 Требования к оптимизирующим алгоритмам Максимальная машинная независимость и переносимость на другие платформы. Трудоёмкость разработки (в т.ч. тестирование) не должна превышать 10%-15%. Алгоритм должен давать выигрыш не менее чем на 20%-25% в скорости выполнения. Оптимизация должна допускать безболезненное внесение изменений.
7
ННГУIT Lab 6 1.3 Правила оптимизации 1.Прежде, чем оптимизировать код, следует иметь надёжно работающий не оптимизированный вариант. 2.Основной прирост оптимизации даёт не учёт особенностей системы, а алгоритмическая оптимизация. 3.Прежде чем порываться переписывать программу на ассемблер, изучите ассемблерный листинг компилятора на предмет оценки его совершенства.
8
ННГУIT Lab 7 1.4 Проблемы оптимизации Программное непостоянство, связанное с тем, что в многозадачных ОС приложение попадает под влияние чрезвычайно изменчивой окружающей среды. Аппаратное непостоянство, вызванное внутренней ”многозадачностью” самого железа.
9
ННГУIT Lab 8 1.5 Возможные решения проблем Выбирать замер с наименьшим временем выполнения, т.к. прогон с минимальным временем исполнения и представляет собой измерение, в минимальной степени испорченное побочными эффектами. Аппаратное непостоянство неустранимо принципиально.
10
ННГУIT Lab 9 2.1.1 Ядро оперативной памяти Ядро состоит из множества ячеек, каждая из которых хранит всего один бит информации. На физическом уровне ячейки объединяются в прямоугольную матрицу, горизонтальные линейки которой называются строками (Row), а вертикальные – столбцами (Column) или страницами (Page). Страница является минимальной порцией обмена с ядром динамической памяти. Время работы программы определяется ее самой медленной частью. Закон Амдала
11
ННГУIT Lab 10 2.1.2 Интерфейс ядра Выводы микросхемы памяти включают в себя линии адреса, линии данных и специальный вывод WE – Write Enable (Разрешение записи). В случае квадратной матрицы количество адресных линий сокращается вдвое, но и выбор конкретной ячейки памяти отнимает вдвое больше тактов. Причем, возникает неоднозначность, что именно в данный момент находится на адресной линии: номер строки или номер столбца?
12
ННГУIT Lab 11 Решение этой проблемы потребовало двух дополнительных выводов, сигнализирующих о наличии столбца или строки на адресных линиях и окрещенных RAS (от row address strobe - строб адреса строки) и CAS (от column address strobe - строб адреса столбца) соответственно. Задержка между подачей номера строки и номера столбца на техническом жаргоне называется "RAS to CAS delay" (на сухом официальном языке - tRCD). Задержка между подачей номера столбца и получением содержимого ячейки на выходе - "CAS delay" (или tCAC), а задержка между чтением последней ячейки и подачей номера новой строки - "RAS precharge" (tRP). 2.1.3 Интерфейс ядра
13
ННГУIT Lab 12 2.2 Взаимодействие памяти и процессора Процессор взаимодействует с оперативной памятью не на прямую, а через специальный контроллер. Запросы процессора обрабатывает чипсет, который включает в себя : –Контроллер шины (BIU – Bus Interface Init) –Контроллер памяти (MCT – Memory Controller) –Планировщик запросов памяти (MRO – Memory Request Organizer).
14
ННГУIT Lab 13 2.3 Отображение физических DRAM-адресов на логические. Оперативная память это. - Однородный массив данных, доступ к ячейкам которого осуществляется посредством 32-разрядных указателей. (с точки зрения процессора). -Физическое пространство, которое крайне не однородно и делится на банки, адреса страниц и номера столбцов. (на самом деле). Согласованием интерфейсов оперативной памяти и процессора занимается чипсет. Обеспечить эффективную обработку больших массивов данных без учёта архитектурных особенностей DRAM – невозможно.
15
ННГУIT Lab 14 2.4 Оптимизация работы с памятью Оперативная память является одним из самых узких мест, сдерживающих производительность всей системы. Типовые алгоритмы обработки данных задействуют быстродействие оперативной памяти едва ли на треть, а зачастую и менее того! Грамотно организованный обмен данными выполняется, как правило, в три – четыре раза быстрее, причём эффективное взаимодействие с памятью достижимо на любом языке (в том числе интерпретируемом!), а не ограничено лишь одним ассемблером.
16
ННГУIT Lab 15 2.5.1 Разворачивание циклов Глубокая развёртка цикла сокращает время его выполнения более чем в 2 раза! Здесь примеры оптимизированного и не оптимизированного циклов. for (a=0; a<666; a++) // не оптимизированный x+=p[a]; // цикл for (a=0; a<666; a+=2) { x+=p[a]; // оптимизированный цикл x+=p[a+1]; // с двукратным разворотом }
17
ННГУIT Lab 16 2.5.2 Разворачивание циклов (чтение)
18
ННГУIT Lab 17 2.5.3 Разворачивание циклов (запись)
19
ННГУIT Lab 18 2.6.1 Устранение зависимостей по данным Если запрашиваемые ячейки оперативной памяти имеют адресную зависимость по данным (т.е. попросту говоря, одна ячейка содержит адрес другой), процессор не может обрабатывать их параллельно и вынужден простаивать в ожидании поступления адресов. В общем случае время загрузки N ячеек равно: –Зависимых t = N*(Tch + Tmem ), где Tch – латентность чипсета, а Tmem – латентность памяти –Независимых t =Tch+Tmem+N/C, где С – пропускная способность подсистемы памяти.
20
ННГУIT Lab 19 2.6.2 Устранение зависимостей по данным
21
ННГУIT Lab 20 2.7.1 Параллельная обработка данных Линейное чтение независимых данных ещё не обеспечивает их параллельной обработки т.к. чтение двух смежных ячеек в большинстве случаев инициирует один, а не два запроса к подсистеме памяти. Эффективный алгоритм обработки данных: при первом проходе цикла память читается с шагом 32 байта (64/128), что заставляет генерировать запросы чипсету при каждом обращении к памяти.
22
ННГУIT Lab 21 2.7.2 Варианты чтения ячеек
23
ННГУIT Lab 22 2.7.3
24
ННГУIT Lab 23 2.8.1 Оптимизация ссылочных структур данных Как оптимизировать прохождение по списку, если адрес следующего элемента заранее неизвестен, а список сильно фрагментирован? Первое что приходит на ум: разбить один список на несколько независимых списков, обработка которых осуществляется параллельно. Наиболее оптимальная стратегия разбиения достигается при разбиении списка на шесть независимых частей. Это чётко видно из следующей диаграммы. Можно многократно увеличить производительность программы, если при добавлении в конец списка не трассировать весь список, в специальном поле сохранять указатель на последний элемент в списке.
25
ННГУIT Lab 24 2.8.2
26
ННГУIT Lab 25 2.8.3 Уменьшение размера структур данных При однократном обрабатывании фиксированного количества элементов структуры данных скорость обработки обратно пропорциональна шагу обработки(при условии что размер элемента списка меньше 32 байт). Следовательно данные в памяти нужно располагать так плотно, как только это возможно. Производительность системы можно значительно повысить, если использовать раздельные (separated) структуры данных.
27
ННГУIT Lab 26 2.9.1 Рассмотрим следующую структуру. Классическое представление списка – крайне не оптимально с точки зрения подсистемы памяти IBM PC
28
ННГУIT Lab 27 2.9.2 Разделение списка и усечение разрядности указателей
29
ННГУIT Lab 28 2.10.4
30
ННГУIT Lab 29 2.10.1 Группировка операций чтения с операциями записи При обработке больших массивов данных, многократно превышающих емкость кэш-памяти всех уровней, необходимости избегать смешивания команд чтения памяти с командами записи в действительности нет.
31
ННГУIT Lab 30 2.10.2
32
ННГУIT Lab 31 2.11.1 Оптимизация сортировки больших массивов данных Одному из лучших алгоритмов сортировки – quick sort требуется О(n*ln n) операций в среднем и О(n²) в худшем случае. Линейный алгоритм – О(n) операций в худшем случае. На компьютере AMD Athlon 1050 он упорядочивает десять миллионов чисел всего за 0,3 с., что в сто раз быстрее алгоритма quick sort!
33
ННГУIT Lab 32 2.11.2 Сравнение времени сортировки разными алгоритмами
34
ННГУIT Lab 33 2.11.3
35
ННГУIT Lab 34 3.1 Оптимизация КЭШа Кэш (называемый также сверхоперативной памятью) представляет собой высокоскоростное запоминающее устройство небольшой емкости для временного хранения данных, значительно более быстродействующее, чем основная память, но, в отличии от оперативной памяти, не адресуемое и непосредственно “невидимое” для программиста. Кэш-подсистема представляет собой сплошное скопление чудес, сюрпризов и сказок Крис Касперски
36
ННГУIT Lab 35 3.2 Цели и задачи КЭШ-памяти Обеспечение быстрого доступа к интенсивно используемым данным. Согласование интерфейсов процессора и контроллера памяти. Упреждающая загрузка данных. Отложенная запись данных.
37
ННГУIT Lab 36 3.3 Расположение КЭШа в иерархии оперативной памяти
38
ННГУIT Lab 37 3.4 Стратегия помещения данных в КЭШ-память LRU (Least Recently Used) – вытесняет то, к чему дольше всего не обращались. FIFO (First Input First Output) - вытесняет то, что было загружено раньше всех. Randomize-алгоритм – “кидает монетку”. Чтобы продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное. кот Матроскин
39
ННГУIT Lab 38 3.5 Упреждающая загрузка данных Загрузка по требованию (on demand). Спекулятивная (speculative) – необходимы алгоритмы угадывания –неинтеллектуальные алгоритмы –интеллектуальные алгоритмы.
40
ННГУIT Lab 39 3.6 Организация КЭШа Понятие кэш-линейки (cash-line). Понятие ассоциативности КЭШа (прямое отображение). Наборно-ассоциативный КЭШ. Политика записи –сквозная запись (WT – Write True write policy) –обратная политика записи (WB – Write Back write policy).
41
ННГУIT Lab 40 3.7 Двухуровневая организация КЭШа
42
ННГУIT Lab 41 3.8.1 КЭШ-подсистема современных процессоров MOB (Memory Order Buffer – буфер упорядоченной записи в память). L1-Cashe. Буферы записи. Блок интерфейсов с памятью (MIU). Блок интерфейсов с шиной (BIU). L2-Cashe. Двойная независимая шина (DIB – Dual Independent Bus).
43
ННГУIT Lab 42 3.8.2 Основные характеристики Размер кэша первого уровня. Степень ассоциативности и размер банков кэша. Политика записи. Длина кэш-линий.
44
ННГУIT Lab 43 3.9 Влияние размера обрабатываемых данных на производительность (для AMD K6)
45
ННГУIT Lab 44 3.10.1 Влияние размера исполняемого кода на производительность При разработке программы стремитесь проектировать ее так, чтобы все часто используемые циклы вмещались в кэш первого или по крайней мере второго уровня.
46
ННГУIT Lab 45 3.10.2 Изменение удельного времени выполнения команд
47
ННГУIT Lab 46 3.11.1 Выравнивание данных Выравнивание данных необходимо, когда данные выходят за границу кэш- линейки и своим “хвостом” попадают в следующую кэш-линейку – операция чтения занимает уже 6-12 тактов, а данные называются расщепленными (англ. Line- splint).
48
ННГУIT Lab 47 3.11.2 Виды выравнивания static int a; static char b; static int c; static char d; static int a; static int c; static char b; static char d Естественное выравнивание. Выравнивание пользователем: #pragma pack. Пример “плохой” и “хорошей” программы:
49
ННГУIT Lab 48 3.12 Учет ограниченной ассоциативности КЭШа Обработка ячеек памяти с шагом, равным или кратным размеру КЭШ- банка, крайне не производительна и этого любой ценой следует избегать. Пример “плохой” программы: for (a=0; a<googol; a++) { a1=bar[4096]; a2=bar[4096]; a3=bar[4096]; a4=bar[4096]; a5=bar[4096]; }
50
ННГУIT Lab 49 3.13.1 Предвыборка Предвыборка позволяет программисту заранее загружать в кэш ячейки памяти, к которым рассчитывает обращаться в будущем. “Ручное” управление КЭШ-контроллером позволяет выбрать оптимальную стратегию упреждающей загрузки данных.
51
ННГУIT Lab 50 3.13.2 Проблема разницы архитектуры Реализация программной предвыборки различны для разных типов процессоров (Intel и AMD). Приходится реализовывать функции, использующие предвыборку в 2 вариантах, что зачастую “съедает” выигрыш в производительности.
52
ННГУIT Lab 51 3.13.3 Аппаратная предвыборка в микропроцессоре Pentium-4 P-4 отслеживает регулярные шаблоны обращения к данным, что позволяет предугадывать, к каким КЭШ-линейкам в будущем произойдет обращение. Алгоритм: распознавание арифметическую прогрессию и вычислять ее члены. Упреждающая загрузка осуществляется только в пределах одного 4-килобайтового блока памяти, при выходе за его пределы отслеживание шаблонов начинается с начала.
53
ННГУIT Lab 52 3.13.4 Предпочтительная КЭШ- иерархия Для многократно используемых данных предпочтительно делать предвыборку в КЭШ-уровни всех иерархий. Однократно используемые данные и данные гарантированно не вытесняемые из КЭШа первого уровня в КЭШ второго уровня загружать нецелесообразно.
54
ННГУIT Lab 53 3.13.5 Практическое использование предвыборки Смысл использовать предвыборку появляется тогда, когда мы можем предсказать адрес следующей обрабатываемой ячейки. Максимальная производительность достигается в случаях: -предвыборка данных происходит в кэш- иерархию, соответствующую их назначению. -запрашиваемые данные загружаются в точности к моменту обращения. -происходит предвыборка только тех данных, которые действительно необходимы.
55
ННГУIT Lab 54 3.13.6 Увеличение эффективности Предотвращение холостого хода. Уменьшение количества инструкций предвыборки.
56
ННГУIT Lab 55 Разворачивайте циклы, читающие память. Отправляйте контроллеру памяти несколько запросов одновременно. Группируйте операции чтения памяти с операциями записи. Используйте все страницы памяти к которым обращались, целиком. Комбинируйте вычисления с доступом к памяти. Обращайтесь к памяти только тогда, когда это действительно необходимо. Никогда не оптимизируйте программу на отдельно взятой машине. Циклы, которые часто используются, должны умещаться в КЭШ Следите за выравниванием данных при объявлении переменных Используйте предвыборку данных, когда это возможно Заключение
57
ННГУIT Lab 56 Литература Техника оптимизации программ. Эффективное использование памяти. Крис Касперски Intel Processor Identification and the CPUID Instruction (www.intel.com) Intel Architecture Software Developer’s Manual (www.intel.com) Intel Architecture Optimization Manual (www.intel.com)
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.